C++ 如何快速保存大文件中的小更改?

C++ 如何快速保存大文件中的小更改?,c++,performance,file-io,binaryfiles,C++,Performance,File Io,Binaryfiles,我正在寻找一种有效的方法来访问不同位置的大型二进制文件,而无需读写整个文件 该文件由大量行组成,每行包含固定长度数据和可变长度数据,例如: <id><type><some_atributes><just_few_bytes>\n <id><type><some_atributes><block_holding_KB_of_data>\n <id><type><some_a

我正在寻找一种有效的方法来访问不同位置的大型二进制文件,而无需读写整个文件

该文件由大量行组成,每行包含固定长度数据和可变长度数据,例如:

<id><type><some_atributes><just_few_bytes>\n
<id><type><some_atributes><block_holding_KB_of_data>\n
<id><type><some_atributes><some_other_bytes>\n
...
\n
\n
\n
...
我的目标是跳转到一个特定的ID并用新数据覆盖记录

我在考虑
seek()
fwrite()
,但问题是如何
seek()
到正确的行/位置,以便高效地读/写,而无需检查行尾的每个字节?数据库中没有类似的问题吗

我的目标是跳转到一个特定的ID并用新的ID覆盖记录 数据


您需要至少遍历整个文件一次才能执行此操作。由于您的数据似乎带有一个
id
标记,因此您可以创建一个
映射
,然后通过
seekg(文件中的位置)

将文件智能地分割成块来使用该映射进行直接跳转。。。修改相关的块,并在完成后组装整个文件?请参见以下问题:。将固定长度的内容放在单独的文件中,或者放在开头,对于每个条目,还将偏移量存储在块所在的文件中。然后,固定大小的索引为您提供了随机访问。为了减少每个记录多次读取造成的命中,请选择一些将直接存储在索引中的少量数据字节。但在同一个规范中谈论“行”和“KB数据”似乎有些奇怪。如果它是二进制的,您根本就没有或想要“\n”。如果您控制格式,为什么不像您提到的那样使用数据库引擎呢
sqlite3
是自包含的,直接在单个文件上操作,被广泛使用,具有自由的许可证等。您的可变长度数据将是一个“blob”。…数据库中没有类似的问题吗?“内部数据库使用固定大小的记录和/或单独的索引表来解决此问题。当您需要更改线的长度时,您也会遇到这样的问题。SQLite似乎很适合解决您的问题: