std::ofstream::write 添加字符
Posted
技术标签:
【中文标题】std::ofstream::write 添加字符【英文标题】:std::ofstream::write adds characters 【发布时间】:2014-02-24 08:45:31 【问题描述】:我正在尝试使用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
字节?
【问题讨论】:
【参考方案1】:您必须在打开时指定std::ofstream::binary
。
否则,在文本文件模式下的 Windows 上,程序中的 \n
(0x0a
) 将在写入/读取文件时转换为 \r\n
(0x0d 0x0a
)。
【讨论】:
@MarkGarcia 在 SO 上没有诗 ;) 很好,它被永久保存在编辑部分:p 但是在阅读这里的答案时想到一个俳句......仅此一项就足够了:) 您可能会补充说,仅二进制模式不足以确保他可以重新读取文件。您不能只是将内存映像转储到磁盘并期望稍后重新读取它们。 (他需要reinterpret_cast
来执行此操作这一事实应该很好地表明它不会起作用。)【参考方案2】:
您以文本模式打开文件并在 Windows 上运行。它将0x0d
添加到0x0a
。创建ofstream实例时需要使用二进制模式。
【讨论】:
【参考方案3】:正在将文件写入进行文本到二进制转换的系统上。 i 的最低字节中的值 10(十六进制 0A)被解释为换行符(又名换行符),并被转换为回车换行序列(十进制 13 10,十六进制 0D 0A)。
要解决此问题,请将代码的第一行 sn-p 更改为如下:
std::ofstream in("testout", std::ios::binary);
这将指示 C++ 运行时库将文件视为二进制文件,并且不在换行符和回车换行序列之间执行任何字节转换。
【讨论】:
以上是关于std::ofstream::write 添加字符的主要内容,如果未能解决你的问题,请参考以下文章