假设我有一个所有记录工作者的二进制文件和文本文件。默认的总月小时数全部设置为 0。我如何实际访问二进制文件中的特定月份并将其更改为所需的值?
这是文本文件格式
ID 名称 JFM 1 简 0 0 0 2 标记 0 0 0 3 开尔文 0 0 0
至
ID 名称 JFM 1简0 0 25 2 标记 0 0 30 3 开尔文 0 0 40
25 实际上是三月份的工作时间。
假设我有一个所有记录工作者的二进制文件和文本文件。默认的总月小时数全部设置为 0。我如何实际访问二进制文件中的特定月份并将其更改为所需的值?
这是文本文件格式
ID 名称 JFM 1 简 0 0 0 2 标记 0 0 0 3 开尔文 0 0 0
至
ID 名称 JFM 1简0 0 25 2 标记 0 0 30 3 开尔文 0 0 40
25 实际上是三月份的工作时间。
我认为这里的第一个问题是“二进制”是什么意思。您是否按字面意思显示文件的格式?换句话说,在输入时,字符是“0”还是“\0”?完成后,您希望文件包含两个数字“3”和“0”还是单个字符“\25”、“\30”或“\40”?
如果您正在处理每个记录中已知偏移量处的单个字符以供输入,并希望将其替换为单个字符作为结果,那么事情很容易:在文件中寻找正确的偏移量,写入一个字节,寻找下一个偏移量,然后继续,直到您更新了所有记录。
如果输入文件包含字符串,那么当您更新值时,它的长度会(可能)发生变化,那么您几乎会陷入读取数据、在内存中修改数据以及将新数据写回(通常是新文件)。这也很容易,但如果您的文件很大,可能会很慢。
如果你在一个真正的程序中这样做,我会三思而后行。我会考虑使用类似SQLite的东西来处理数据。这不仅可以让您简化代码,还可以让您的客户的生活更加美好。它使用已知/记录的文件格式,因此其他工具可以处理数据、进行备份等。它支持事务、日志记录、回滚等。简而言之,它们得到了一个强大的解决方案,而不是另一个脆弱的问题。
文件是字节流。您可以使用 c 系列函数 fopen fread fwrite 访问文件。或者通过 c++ iostream 操作。在每种情况下,您通常需要通过知道其位置然后读取和写入该记录来找到该记录。如果记录不是固定大小,您将不得不处理移动所有后续记录。