【问题标题】:std::ofstream::write adds charactersstd::ofstream::write 添加字符
【发布时间】: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 字节?

【问题讨论】:

    标签: c++ ofstream


    【解决方案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++ 运行时库将文件视为二进制文件,并且不在换行符和回车换行序列之间执行任何字节转换。

      【讨论】:

        猜你喜欢
        • 2012-10-12
        • 2018-08-30
        • 1970-01-01
        • 2019-06-16
        • 1970-01-01
        • 2017-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多