【问题标题】: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 相同。

          二进制流只写入字节,不会在任何平台上进行任何转换。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-16
            • 2019-11-06
            • 2010-12-04
            • 2016-02-14
            • 1970-01-01
            • 2019-07-24
            • 1970-01-01
            • 2012-08-14
            相关资源
            最近更新 更多