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

use*_*333 3 c++ byte file

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

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

#include <fstream>

int main()
{
    std::ofstream ofs {"foo", std::ios::binary};
    ofs.seekp(0x2);
    ofs.put(0x7);
}
Run Code Online (Sandbox Code Playgroud)

一般来说,SO 上的人们似乎建议读取整个文件,然后在内存中更改它,然后再次将其写出。然而,仅仅改变一个字节似乎需要太多工作。

是否不可能就地覆盖单个字节?

joh*_*ohn 5

如果您不想在当前文件末尾之前插入任何新字节,则完全有可能(实际上很常见)更新文件。

改成这样

std::ofstream ofs {"foo", std::ios::in|std::ios::out|std::ios::binary};
Run Code Online (Sandbox Code Playgroud)

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

通过仅使用std::ios::binaryofstream构造函数调整为std::ios::out|std::ios::binary),您就破坏了文件内容。然后,您的代码利用了 C/C++ I/O 的一个鲜为人知的功能,即可以在文件末尾之外进行查找。如果文件处于此状态时写入任何字节,则文件末尾和当前位置之间的间隙将用零填充。

以下是有关不同文件模式的用途的参考。