【问题标题】:Overwrite file content from a specified position and truncate the rest从指定位置覆盖文件内容并截断其余部分
【发布时间】:2015-03-25 22:36:32
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • C++ 标准库不提供这样的功能。您必须使用您的操作系统 API。

标签: c++ ofstream


【解决方案1】:

在标准 c++ 中,您必须

  • 将文件读取到pos 到另一个缓冲区中
  • trunc模式打开文件
  • 将文件内容改写为pos
  • 写入转储

如果您可以将自己限制为特定于操作系统的标准,例如 POSIX,那么您有一个更有效的选择。

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

您可以为此功能编写一个跨平台包装器以支持不同的操作系统,或者您可以使用现有的包装器。 Boost 文件系统有resize_file,其作用与POSIX truncate 相同。

【讨论】:

  • 我认为应该有一种有效的标准方法来做到这一点,但如果没有 POSIX 会适合我。感谢您指出truncate 功能!
  • @mambo_sun 如果可移植性值得为您添加依赖项,您也可以使用 Boost。
猜你喜欢
  • 2021-11-29
  • 1970-01-01
  • 2013-09-20
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 2019-05-04
  • 2016-09-04
相关资源
最近更新 更多