从指定位置覆盖文件内容并截断其余部分

Overwrite file content from a specified position and truncate the rest

假设我在二进制文件 f 中有一个位置 pos 和一些大小为 n 的缓冲区,我想将其转储到 f从位置 pos 开始。如果文件的大小小于 pos + n,我还想放大文件;如果文件的大小更大,我想缩短文件的长度(删除 pos + n 之后的所有内容)。

什么是标准、最正确、最快速、最优雅的方法?

我知道,我必须使用 ofstreamseekp 等,但不确定如何在必要时删除文件的其余部分。

谢谢!

在标准 C++ 中,您必须

  • 将文件读入 pos 到另一个缓冲区
  • 使用trunc模式打开文件
  • 重写文件内容最多 pos
  • 写入转储

如果您可以将自己限制在 OS 特定标准,例如 POSIX,您就有了更有效的选择。

  • 寻求pos
  • 写入转储
  • truncate 使用系统调用 pos + n 长度

您可以为此功能编写跨平台包装器以支持不同 OS,或者您可以使用现有包装器。 Boost 文件系统有 resize_file 和 POSIX truncate.

一样