应将任何 C 文件作为二进制文件打开

Should open any C file as a binary file

我在某处读到我们应该始终以二进制文件的形式在 C 中打开文件(即使它是文本文件)。当时(几年前)我并不太在意,但现在我真的很需要了解是不是这样,为什么会这样。

我一直在尝试搜索这方面的信息,但我发现的最多的是它们之间的开头差异 - 甚至不是它们的结构差异。

所以我想我的问题是:为什么我们总是要以二进制文件打开文件,即使我们事先猜测它是一个文本文件?第二个问题在于每个文件本身的结构,二进制文件是否像"encrypted"文本文件?

名称 "text" 与 "binary" 虽然很容易记忆,但有时会让您想知道该应用哪个。最好将它们转化为它们的基本机制,然后根据您需要的那些中的哪一个来选择。

"Binary"也可以称为"verbatim"开启方式。文件中的每个字节都将按磁盘上的原样读取。这意味着如果它是一个 Windows 文件,其中一行包含文本 "ABC"(包括行终止符),则从文件中读取的字节将为 65 66 67 13 10.

"Text"模式也可以称为"line-terminator translating"开启模式。当文件包含由您 运行 所在的平台定义为 "line terminator"(1) 的 1 个或多个字符序列时,整个序列将从文件中读取,但运行时将使它看起来好像只读取了字符 '\n'(使用 ASCII 时为 10)。对于上面的同一个 Windows 文件,如果它在 Windows 上作为文本文件打开,从文件中读取的字节将为 65 66 67 10.

写入时同样适用:一个文件 openend as "binary" 写入将准确写入您给它的字节。以 "text" 打开的文件会将字节 '\n'(ASCII 中的 10)转换为平台定义为行终止字符序列的任何内容。

我认为无法从上述内容中提炼出 "always do this" 规则,但也许您可以使用它为每个案例做出明智的决定。


(1) 在 Unix 风格的系统上,行终止字符序列是 LF (ASCII 10)。在 Windows 上,它是双字符序列 CR LF (ASCII 13 10)。在旧的 pre-X Mac OS 上,它只是单字符 CR (ASCII 13).