C++ ifstream、ofstream:使用原始read()/write()调用与以二进制模式打开文件有什么区别?

5
这个问题涉及到 ifstream 和 ofstream 在读写文件时的行为。
从阅读 stackoverflow.com 的文章中,我了解到 operator<<(流插入运算符)将诸如双精度浮点数之类的对象转换为文本表示形式后输出,并且调用 read() 和 write() 函数分别以二进制格式读取和写入原始数据。编辑:这一点很明显,没有什么意外的。
我还发现,在二进制模式下打开文件可以防止自动翻译不同操作系统所需的换行符。
因此,我的问题是:当调用函数 read() 和 write() 时,是否会发生这种自动翻译,例如从 \n 转换为 \r\n?或者这种行为只针对 operator<<(以及 operator>>)?
请注意,这里有一个类似但稍微不太具体的问题。它没有给出确定的答案。 使用 ios::binary 模式打开流时使用 read/write 的差异

1
二进制和文本模式 - πάντα ῥεῖ
2
@πάνταῥεῖ 这并没有回答问题。好像 OP 已经理解了二进制和文本模式之间的区别。问题在于 C++ 流中还有格式化和非格式化 I/O 的概念。据我理解,这个问题是关于这两者如何相互作用的。 - ComicSansMS
@ComicSansMS 是的 - 本质上我想知道如果我创建一个字符缓冲区,其中装满了看起来像'\n'字符的东西,然后如果我调用write()将其写入磁盘,我的磁盘上的文件会具体显示为什么?也就是说:它会是一堆'\n'还是会是两倍长度的包含CRLF的东西,比如在Windows操作系统上? - FreelanceConsultant
很难说 - 如果信息没有清晰地呈现出来,那可能就是我没有找到它的原因。我已经使用C++很多年了,直到最近才偶然发现这个问题。有人能为我澄清一下吗,而不是把我重定向到其他网页,在那里信息可能存在也可能不存在,如果存在,它可能会被埋在大量的文本页面中。 - FreelanceConsultant
我的假设是,read()和write()会在任何操作系统上都执行明智的行为,即不进行翻译,但这只是我认为合理的行为,现实可能会有所不同。也就是说:它们以最快的方式编写二进制数据,并且从不查看是否存在任何8位块类似于“\n”的情况。 - FreelanceConsultant
显示剩余3条评论
1个回答

4
二进制模式和文本模式的区别在于它们的底层实现。
如果以文本模式打开文件,即使使用读取和写入操作,您也会得到翻译后的数据。
请注意,只有当位置是从先前的 tell(或0)获得时,才允许在文本文件中寻找位置。为了能够进行随机定位,文件必须以二进制模式打开。

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