【问题标题】:How to overwrite only part of a file in c++如何在c ++中仅覆盖文件的一部分
【发布时间】:2012-01-18 15:56:01
【问题描述】:

我想使用 c++ 对文本文件的中间部分进行修改,而不更改文件的其余部分。我该怎么做?

【问题讨论】:

  • 这不是重复的。上一篇文章只是关于如何读取记录,这是关于写入文件的。您需要仔细阅读。
  • 您对替换长度相同的阐述使得如何重新定位文件指针成为问题的核心,这正是您提供的其他问题的答案。

标签: c++ text-files


【解决方案1】:

使用 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 可以防止这种情况发生。
  • 那么,我是否必须打开文件进行读写以修改文件的一部分,即使我从未真正读取 ?是否可以使用 only 写入权限修改(而不是追加)而不覆盖所有内容?也许 fseek 本身需要打开文件以供读取,即使不使用 fread ? (虽然这对我来说似乎很奇怪)最后,这是操作系统的限制,还是标准 C++ 库的工作原理?
  • @qbert220 你的评论很有价值,对我很有用。我遇到了同样的问题,每当我尝试将大量数据写入文件时,它都会替换整个文件,导致我挠头,直到找到您的评论。谢谢老哥
【解决方案2】:

如果替换字符串的长度相同,您可以在原地进行更改。如果替换字符串较短,您可以用零宽度空格或类似的空格填充它以使其具有相同的字节数,并就地进行更改。如果替换字符串较长,除非您先移动所有剩余数据,否则空间不足。

【讨论】:

  • 这听起来不错,但它的代码是什么?假设字符串的长度相同。
  • 嗯,这取决于您使用的 I/O 库、C 标准库、C++ 标准库或特定于操作系统的 API。但一般分为三个步骤。打开文件时,指定不截断的写入权限,例如fopen(fname,“r+”)。寻找所需的位置,例如寻找。用例如写新字符串fwrite 或 fprintf。在某些 API(如 Windows OVERLAPPED 或 linux aio)中,您可以说“写入此位置”而无需单独的查找步骤。
  • fseek 不适用于 ofstream。用ofstream怎么做?
  • 好的,我将强调我之前评论的一部分“打开文件时,指定写入权限而不截断”。来自stdcxx.apache.org/doc/stdlibug/30-3.html对于输出文件流,打开模式 out 等价于 out|trunc,即可以省略 trunc 标志。所以使用双向 fstream 而不是 ofstream。
  • 很高兴你终于到了那里。将来,如果您告诉我们:什么库、什么编译器以及您是否希望它可移植、到目前为止您尝试了什么、您现在看到的行为以及你想要什么。对于这个问题,说“我正在尝试使用 ofstream 仅覆盖文件的一部分。这是代码(实际上您确实将其放在另一个问题中)。新数据显示在文件中,但没有不管我做什么,以前的内容都会消失。如何在保留文件其他部分的同时进行编辑。”
【解决方案3】:

通常,以文本模式打开文件进行读取,逐行读取直到要更改的位置,在读取行时,将它们写入您打开用于写入的第二个文本文件中。在要更改的地方,将新数据写入第二个文件。然后继续读/写文件到最后。

【讨论】:

  • 我想避免这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多