覆盖文件中的字节而不清除它



如何在不清除整个文件的情况下覆盖文件中的一个字节?请注意,我不想插入额外的字节,而是覆盖某个偏移量的字节。

我尝试过用以下代码在某个偏移量处写入一个字节。然而,这会清除指定偏移量之后的所有内容,这不是我想要的。

#include <fstream>
int main()
{
std::ofstream ofs {"foo", std::ios::binary};
ofs.seekp(0x2);
ofs.put(0x7);
}

一般来说,SO上的人似乎建议阅读整个文件,然后在内存中更改它,然后再把它写出来。然而,仅仅更改一个字节似乎工作量太大。

是否不可能在适当的位置覆盖单个字节?

如果您不想在文件的当前末尾之前插入任何新字节,那么更新文件是完全可能的(事实上很常见(。

更改到此

std::ofstream ofs {"foo", std::ios::in|std::ios::out|std::ios::binary};

然而,如果文件不存在,这将失败,但听起来这不是一个问题。

只需使用std::ios::binary(ofstream构造函数将其调整为std::ios::out|std::ios::binary(就可以销毁文件内容。然后,您的代码利用了C/C++I/O的一个鲜为人知的功能,即可以在文件末尾之外进行搜索。如果在文件处于这种状态时写入了任何字节,则文件末尾和当前位置之间的间隙将用零填充。

这里有一个关于不同文件模式的参考

最新更新