从指定位置覆盖文件内容并截断其余部分
Overwrite file content from a specified position and truncate the rest
假设我在二进制文件 f
中有一个位置 pos
和一些大小为 n
的缓冲区,我想将其转储到 f
从位置 pos
开始。如果文件的大小小于 pos + n
,我还想放大文件;如果文件的大小更大,我想缩短文件的长度(删除 pos + n
之后的所有内容)。
什么是标准、最正确、最快速、最优雅的方法?
我知道,我必须使用 ofstream
、seekp
等,但不确定如何在必要时删除文件的其余部分。
谢谢!
在标准 C++ 中,您必须
- 将文件读入
pos
到另一个缓冲区
- 使用
trunc
模式打开文件
- 重写文件内容最多
pos
- 写入转储
如果您可以将自己限制在 OS 特定标准,例如 POSIX,您就有了更有效的选择。
- 寻求
pos
- 写入转储
truncate
使用系统调用 pos + n
长度
您可以为此功能编写跨平台包装器以支持不同 OS,或者您可以使用现有包装器。 Boost 文件系统有 resize_file
和 POSIX truncate
.
一样
假设我在二进制文件 f
中有一个位置 pos
和一些大小为 n
的缓冲区,我想将其转储到 f
从位置 pos
开始。如果文件的大小小于 pos + n
,我还想放大文件;如果文件的大小更大,我想缩短文件的长度(删除 pos + n
之后的所有内容)。
什么是标准、最正确、最快速、最优雅的方法?
我知道,我必须使用 ofstream
、seekp
等,但不确定如何在必要时删除文件的其余部分。
谢谢!
在标准 C++ 中,您必须
- 将文件读入
pos
到另一个缓冲区 - 使用
trunc
模式打开文件 - 重写文件内容最多
pos
- 写入转储
如果您可以将自己限制在 OS 特定标准,例如 POSIX,您就有了更有效的选择。
- 寻求
pos
- 写入转储
truncate
使用系统调用pos + n
长度
您可以为此功能编写跨平台包装器以支持不同 OS,或者您可以使用现有包装器。 Boost 文件系统有 resize_file
和 POSIX truncate
.