覆盖文件中的字节而不清除它
Overwrite byte in file without clearing it
如何在不清除整个文件的情况下覆盖文件中的一个字节?请注意,我不想插入额外的字节,而是在某个偏移量处覆盖一个字节。
我试过以下代码在某个偏移量处写入一个字节。然而,这会清除指定偏移量之后的所有内容,这不是我想要的。
#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 的一个鲜为人知的功能,即可以在文件末尾之外进行搜索。如果文件处于此状态时写入任何字节,则文件末尾和当前位置之间的间隙将用零填充。
这里 reference 介绍了不同文件模式的作用。
如何在不清除整个文件的情况下覆盖文件中的一个字节?请注意,我不想插入额外的字节,而是在某个偏移量处覆盖一个字节。
我试过以下代码在某个偏移量处写入一个字节。然而,这会清除指定偏移量之后的所有内容,这不是我想要的。
#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 的一个鲜为人知的功能,即可以在文件末尾之外进行搜索。如果文件处于此状态时写入任何字节,则文件末尾和当前位置之间的间隙将用零填充。
这里 reference 介绍了不同文件模式的作用。