如何用c ++覆盖文件的一部分

neu*_*cer 9 c++ text-files

我想使用c ++修改文本文件的中间部分,而不改变文件的其余部分.我怎样才能做到这一点?

Zun*_*Tzu 14

使用std :: fstream.

更简单的std :: ofstream不起作用.它会截断你的文件(除非你使用选项std :: ios_base :: app,这不是你想要的).

std::fstream s(my_file_path); // use option std::ios_base::binary if necessary
s.seekp(position_of_data_to_overwrite, std::ios_base::beg);
s.write(my_data, size_of_data_to_overwrite);
Run Code Online (Sandbox Code Playgroud)

  • 使用 `std::ios_base::binary | std::ios_base::out` 模式标志在数据写入文件后导致截断。使用 `std::ios_base::binary | std::ios_base::out | std::ios_base::in` 阻止了这种情况。 (3认同)
  • @qbert220 你的评论非常有价值,对我来说非常有用。我遇到了同样的问题,每当我尝试将大量数据写入文件时,它都会替换整个文件,导致我摸不着头脑,直到找到您的评论。谢了哥们 (2认同)

Ben*_*igt 8

如果替换字符串的长度相同,则可以进行更改.如果替换字符串较短,您可以用零宽度的空间或类似垫它,使其在相同的字节数,并在适当位置的变化.如果替换字符串较长,除非您先移动所有剩余数据,否则没有足够的空间.

  • 嗯,这取决于您使用的I/O库,C标准库,C++标准库或特定于操作系统的API.但通常有三个步骤.打开文件时,指定不带截断的写访问权限,例如fopen(fname,"r +").用例如fseek寻找所需的位置.用例如fwrite或fprintf写新字符串.在某些API中,如Windows OVERLAPPED或Linux aio,您可以说"写入此位置"而无需单独的搜索步骤. (3认同)
  • 好的,我会强调我之前评论的一部分"打开文件时,指定写入权限,不带截断".来自http://stdcxx.apache.org/doc/stdlibug/30-3.html, <quote>对于输出文件流,打开模式输出相当于out | trunc,也就是说,你可以省略trunc标志</报价>.因此,使用双向fstream而不是ofstream. (3认同)
  • 很高兴你终于到了那里.如果你告诉我们,未来你会得到一个更快的答案,更少的挫折感:什么库,什么编译器以及你是否想要它可移植,到目前为止你尝试过什么,你现在看到的行为,以及你想要什么.对于这个问题,它有助于说"我试图使用ofstream覆盖文件的一部分.这是代码(你实际上把它放在另一个问题中).新数据显示在文件中,但没有无论我做什么,之前的内容都会消失.如何在保留文件的其他部分的同时进行编辑." (2认同)