为啥 C++ ofstream write() 方法会修改我的原始数据?

Posted

技术标签:

【中文标题】为啥 C++ ofstream write() 方法会修改我的原始数据?【英文标题】: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,有没有标准的方法让它不这样做?

【问题讨论】:

【参考方案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 到底出了什么问题……我从来没有遇到过他们的问题

【讨论】:

以上是关于为啥 C++ ofstream write() 方法会修改我的原始数据?的主要内容,如果未能解决你的问题,请参考以下文章

std::ofstream::write 添加字符

为啥我可以在临时 std::ofstream 对象上使用 `operator<<`?

ofstream中write函数怎么用的?

C++中对文件的操作

为啥 ostream::write() 在 C++ 中需要“const char_type*”而不是“const void*”?

C++中,ifstream和ofstream定义文件流的区别