【发布时间】:2012-01-18 15:56:01
【问题描述】:
我想使用 c++ 对文本文件的中间部分进行修改,而不更改文件的其余部分。我该怎么做?
【问题讨论】:
-
这不是重复的。上一篇文章只是关于如何读取记录,这是关于写入文件的。您需要仔细阅读。
-
您对替换长度相同的阐述使得如何重新定位文件指针成为问题的核心,这正是您提供的其他问题的答案。
标签: c++ text-files
我想使用 c++ 对文本文件的中间部分进行修改,而不更改文件的其余部分。我该怎么做?
【问题讨论】:
标签: c++ text-files
使用 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);
【讨论】:
std::ios_base::binary 标志,不要忘记您需要使用 std::ios_base::out 或 this
std::ios_base::binary | std::ios_base::out 模式标志会导致数据写入文件后截断。使用std::ios_base::binary | std::ios_base::out | std::ios_base::in 可以防止这种情况发生。
如果替换字符串的长度相同,您可以在原地进行更改。如果替换字符串较短,您可以用零宽度空格或类似的空格填充它以使其具有相同的字节数,并就地进行更改。如果替换字符串较长,除非您先移动所有剩余数据,否则空间不足。
【讨论】:
对于输出文件流,打开模式 out 等价于 out|trunc,即可以省略 trunc 标志。所以使用双向 fstream 而不是 ofstream。
通常,以文本模式打开文件进行读取,逐行读取直到要更改的位置,在读取行时,将它们写入您打开用于写入的第二个文本文件中。在要更改的地方,将新数据写入第二个文件。然后继续读/写文件到最后。
【讨论】: