【问题标题】:Why does the C++ ofstream write() method modify my raw data?为什么 C++ ofstream write() 方法会修改我的原始数据?
【发布时间】:2009-08-29 02:19:54
【问题描述】:

我在内存中的 char[] 缓冲区中有一个 jpeg 图像,我需要做的就是将它完全按原样写入磁盘。现在我正在做这个

ofstream ofs;
ofs.open(filename);
ofs.write(buffer, bufferLen);
ofs.close();

但图像显示不正确,它看起来乱码,到处都是随机的黑白条纹。在十六进制查看器中将图像与原始图像进行比较后,我发现 ofstream 在它认为我正在编写换行符时正在修改数据。在原始文件中出现 0x0A 的任何地方,ofstream 都会写入两个字节:0x0D0A。我必须假设 ofstream 打算仅从 LF 转换为 CRLF,有没有标准的方法让它不这样做?

【问题讨论】:

    标签: c++ visual-studio file-io


    【解决方案1】:

    打开文件时设置模式为二进制:

    http://www.cplusplus.com/reference/iostream/ofstream/ofstream/

    【讨论】:

    • 谢谢,我知道这一定很简单
    【解决方案2】:

    当你是opening它时,你应该将文件模式设置为binary:

    std::ofstream file;
    file.open("filename.jpg", std::ios_base::out | std::ios_base::binary);
    

    这样,流就不会尝试将换行符调整为您的原生文本格式。

    【讨论】:

      【解决方案3】:

      尝试以二进制形式打开 ofstream。 像这样的东西应该可以工作:

      ofstream ofs;
      ofs.open(filename, ios::out | ios::binary);
      ofs.write(buffer, bufferLen);
      ofs.close();
      

      【讨论】:

        【解决方案4】:

        由于您不是以二进制模式打开文件,因此默认设置为格式化输出。在格式化输出中,您的实现会按照您的描述执行行尾字符的转换。

        【讨论】:

          【解决方案5】:

          我希望我的版本可以写任何东西...没有错误,没有抱怨,调试它时没有任何错误,但它甚至没有尝试创建文件。 fopen、fwrite 和 fclose 到底出了什么问题……我从来没有遇到过他们的问题

          【讨论】:

            猜你喜欢
            • 2021-08-07
            • 2019-07-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-09
            • 1970-01-01
            • 2016-06-25
            • 1970-01-01
            相关资源
            最近更新 更多