【问题标题】:What Makes a Binary Stream Special?是什么让二进制流特别?
【发布时间】:2011-11-22 21:34:15
【问题描述】:
std::fstream 可以选择将流视为二进制而不是文本。有什么区别?
据我所知,这完全取决于文件在其他程序中的打开方式。如果我将A 写入二进制流,它只会被转换为01000001(65,A 的 ASCII 码)——完全相同的表示。这可以在文本编辑器中读取为字母“A”,或者在其他程序中读取为二进制序列01000001。
我是否遗漏了什么,或者流是否被认为是二进制没有任何区别?
【问题讨论】:
标签:
c++
file
text
binary
fstream
【解决方案1】:
在文本流中,换行符可以与\n 字符相互转换;对于二进制流,这不会发生。原因是不同的操作系统有不同的存储换行符的约定。 Unix 使用 \n,Windows 使用 \r\n,而老式 Mac 使用 \r。对于使用文本流的 C++ 程序,这些都显示为 \n。
【解决方案2】:
反之亦然,它是特殊的文本流,特别是因为 \n 转换为 \n 或 \r\n(甚至是 \r..),具体取决于您的系统。
【解决方案3】:
实际区别在于 Microsoft 操作系统上对行尾序列的处理。
二进制流精确地返回文件中存储的数据。文本流对行尾序列进行规范化,将它们替换为'\n'。
【解决方案4】:
如果您将其作为文本打开,则 C 或 C++ 运行时将根据主机(Windows 或 linux)执行换行符转换。
【解决方案5】:
在 Linux/Unix/Android 上没有区别。
在 Mac OS/X 或更高版本上没有区别,但我认为较旧的 Mac 可能会在阅读时将“\n”更改为“\r” ,而写入则相反(仅适用于文本流)。
在 Windows 上,对于文本流,某些字符会得到特殊处理。 '\n' 字符被写成 "\r\n",而 "\r\n" 对被读作 '\n'。 '\0x1A' 字符被视为“文件结尾”并终止读取。
我认为 Symbian PalmOS/WebOS 的行为与 Windows 相同。
二进制流只写入字节,不会在任何平台上进行任何转换。