我在某处读过我们应该始终将 C 中的文件作为二进制文件打开(即使它是文本文件)。当时(几年前)我并不太关心它,但现在我真的需要了解是否是这样以及为什么会这样。
我一直在尝试搜索这方面的信息,但我发现最多的是它们之间的开放差异 - 甚至不是它们的结构差异。
所以我想我的问题是:为什么我们应该始终将文件作为二进制文件打开,即使我们事先猜测它是一个文本文件?第二个问题在于每个文件本身的结构,二进制文件是否类似于“加密”文本文件?
最佳答案
“文本”与“二进制”这两个名称虽然很容易内存,但有时会让您想知道该应用哪一个。最好将它们转化为其底层机制,并根据您需要的其中进行选择。
“二进制”也可以称为“逐字”打开方式。文件中的每个字节都将按磁盘上的原样读取。这意味着如果它是一个 Windows 文件,其中一行包含文本“ABC”(包括行终止符),则从文件中读取的字节将为 65
66
67
13
10
。
“文本”模式也可称为“行终止符翻译”打开模式。当文件包含由您运行的平台定义为“行终止符”(1) 的 1 个或多个字符序列时,将从文件中读取整个序列,但是运行时会使它看起来好像只读取了字符 '\n'
(使用 ASCII 时为 10
)。对于上面的同一个 Windows 文件,如果在 Windows 上将其作为文本文件打开,则从文件中读取的字节将为 65
66
67
10
.
这同样适用于写入:作为“二进制”写入的文件 openend 将准确写入您给它的字节。作为“文本”打开的文件会将字节 '\n'
(ASCII 中的 10
)转换为平台定义的行终止字符序列。
我认为不能从上面的内容中提炼出“始终这样做”的规则,但也许您可以使用它来针对每种情况做出明智的决定。
<小时/>(1) 在 Unix 风格的系统上,行终止字符序列为 LF
(ASCII 10
)。在 Windows 上,它是两个字符序列 CR LF
(ASCII 13
10
)。在旧的 X 之前的 Mac 操作系统上,它只是单字符 CR
(ASCII 13
)。
关于c - 应该将任何 C 文件作为二进制文件打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50199139/