C ++ ifstream,ofstream:原始read()/ write()调用和二进制模式下打开文件之间的区别是什么?

时间:2015-06-12 11:06:16

标签: c++ file-io ifstream ofstream

此问题涉及在向文件读取和写入数据时ifstream和ofstream的行为。

从阅读stackoverflow.com我已经设法找出operator<<(流插入运算符)在输出之前将诸如双精度的对象转换为文本表示,并调用read()和{{1}读取和写入原始数据,因为它分别存储在内存(二进制格式)中。编辑:这很明显,这里没有任何意外。

我还发现以二进​​制模式打开文件会阻止不同操作系统根据需要自动转换换行符。

所以我的问题是:这是自动翻译,例如;调用函数write()\n时会出现从\r\nread()的情况?或者此行为仅适用于write()。 (还有operator<<。)

请注意,这里有类似但稍微不那么具体的问题。它没有给出明确的答案。 Difference in using read/write when stream is opened with/without ios::binary mode

2 个答案:

答案 0 :(得分:4)

二进制和文本模式之间的差异在较低的水平。

如果您在文字模式下打开文件,即使使用readwrite操作,也会获得翻译数据。

请注意,只有当位置是从之前的seek(或0)获得时,您才允许tell到文本文件中的某个位置。为了能够进行随机定位,必须以二进制模式打开文件。

答案 1 :(得分:-2)

简短回答 - 使用read()&amp;写()。 [你的问题的答案是“不。”]

更长的答案 - 阅读()&amp; write()以二进制模式运行,这意味着内容被认为是“二进制数据”。 A \ n是ASCII 10,10是合法数据值,例如,可以表示数字10。

将\ n更改为\ r \ n的业务是Windows问题。在Linux中,行尾仅用\ n标记,不需要翻译。

如果你看一下http://linux.die.net/man/3/fopen fopen的手册页,那就是这个段落

The mode string can also include the letter 'b' either as a last character or as a character between the characters in any of the two-character strings described above. This is strictly for compatibility with C89 and has no effect; the 'b' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding the 'b' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-UNIX environments.)

希望这会有所帮助。