std::fstream
有将流视为二进制而不是文本的选项。它们之间的区别是什么呢?
据我所知,这完全取决于文件在其他程序中如何打开。如果我向二进制流写入A
,它只会被转换为01000001
(65,即A
的ASCII码)- 完全相同的表示方法。这可以在文本编辑器中读作字母“A”,或者在其他程序中读作二进制序列01000001
。
我是否错过了什么,或者无论流是否被视为二进制都没有任何区别?
\n
字符;而在二进制流中,则不会发生这种情况。原因是不同的操作系统有不同的约定来存储换行符;Unix使用\n
,Windows使用\r\n
,旧款Mac使用\r
。对于使用文本流的C++程序来说,所有这些都显示为\n
。\n
被翻译成系统中的 \n
或者 \r\n
(甚至是 \r
),这取决于你的系统。实际上的区别在于对于微软操作系统中换行序列的处理方式。
二进制流以文件中存储的精确数据返回。文本流会规范化换行序列,将其替换为 '\n'
。
如果您将其作为文本打开,则C或C++运行时将根据主机(Windows或Linux)执行换行符转换。
在 Linux/Unix/Android 上没有区别。
在 Mac OS/X 及之后的版本上也没有区别,但是我认为旧版的 Mac 在读取时可能会将 '\n' 转换为 '\r',在写入时将其反转(仅适用于文本流)。
对于文本流,在 Windows 上会特别处理一些字符。一个 '\n' 字符将被写入为 "\r\n",而一个 "\r\n" 对将被读取为 '\n'。一个 '\0x1A' 字符被视为“文件结束”并终止读取。
我认为 Symbian PalmOS/WebOS 的行为与 Windows 相同。
二进制流只会在任何平台上写入字节,不会进行任何转换。