一种覆盖文件中少数位置的方法
A way to overwrite few positions in file
我从文件中的某些位置正确地读取了值,但是当我需要重写这些值时遇到了问题。在我的文件 reader 没有在所需位置找到他需要的东西之后,这一切都在文件中搞砸了。有没有办法覆盖整行,避免这些情况?
我正在使用 lseek() 函数将文件指针移动到我需要的位置。
既然你说 "line",我假设你在谈论文本文件。
在那种情况下:不,没有办法覆盖单行,除了如果你想写的新行是正好 一样的长度。
这是因为磁盘上的文件抽象不像编辑文件那样工作。一个文本编辑器,你不能在中间做 insert/delete 而不重写更改点之后的所有尾随数据。
通常你需要在内存中构造变化并覆盖整个文件(或者至少是变化开始的部分)。
你可以
- 读取要更改的行后的尾部,并与更改一起写回,或者
- 求助于内存映射文件:您可以像使用 C 字符串一样进行更改,OS 会处理其余部分。
我更喜欢内存映射文件。当可移植性成为问题时,boost 为它们提供了可移植的抽象。在使用变体 1 之前,我会考虑这一点。
我从文件中的某些位置正确地读取了值,但是当我需要重写这些值时遇到了问题。在我的文件 reader 没有在所需位置找到他需要的东西之后,这一切都在文件中搞砸了。有没有办法覆盖整行,避免这些情况? 我正在使用 lseek() 函数将文件指针移动到我需要的位置。
既然你说 "line",我假设你在谈论文本文件。
在那种情况下:不,没有办法覆盖单行,除了如果你想写的新行是正好 一样的长度。
这是因为磁盘上的文件抽象不像编辑文件那样工作。一个文本编辑器,你不能在中间做 insert/delete 而不重写更改点之后的所有尾随数据。
通常你需要在内存中构造变化并覆盖整个文件(或者至少是变化开始的部分)。
你可以
- 读取要更改的行后的尾部,并与更改一起写回,或者
- 求助于内存映射文件:您可以像使用 C 字符串一样进行更改,OS 会处理其余部分。
我更喜欢内存映射文件。当可移植性成为问题时,boost 为它们提供了可移植的抽象。在使用变体 1 之前,我会考虑这一点。