std::ofstream::write 函数添加了字符。

9
我正在尝试使用std::ofstream::write方法编写二进制文件。我发现有些字符并没有按原样写入,例如:
std::ofstream in("testout");
int i =10;

in.write((const char *)(&i), sizeof(i));
in.close();

return 0;

以下内容将被写入二进制文件:0d 0a 00 00 00 为什么会出现额外的0d字节?

3个回答

17
您需要在打开文件时指定std::ofstream::binary。否则,在Windows文本模式下,程序中的\n0x0a)在写入/读取文件时会转换为/从\r\n0x0d 0x0a)。

1
@MarkGarcia 在这里不要发诗歌 ;) - P0W
很好,它被保存在编辑部分永恒的地方:p 但是当阅读这里的答案时想到一个俳句...这已经足够引人注目了 :) - deviantfan
1
你可能需要补充说明,仅使用二进制模式并不足以确保能够重新读取文件。你不能只是将内存映像转储到磁盘上,并期望以后能够重新读取它们。(他需要使用reinterpret_cast来实现这一点,这应该是无法正常工作的一个很好的指示。) - James Kanze

6

您以文本模式打开文件并在Windows上运行。它会将0x0d添加到0x0a。创建ofstream实例时,需要使用二进制模式。


4

该文件正在一个进行文本到二进制转换的系统上被写入。i的最低字节中的值10 (0A hex) 被解释为换行符,并被转换为回车换行序列 (13 10 十进制, 0D 0A hex)。

要解决此问题,请将代码段的第一行更改如下:

std::ofstream in("testout", std::ios::binary);

这将指示C++运行库将文件视为二进制文件,不执行任何换行符和回车符之间字节的转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接