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

标签 c file memory binaryfiles

我在某处读过我们应该始终将 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/

相关文章:

c++ - 将结构存储在 ARM 设备的 ROM 中

C:知道变量何时被读取或写入

c - 我怎样才能获得所有文件的列表及其在c中的路径

c - 在 C 中使用 ncurses 的 wrefresh 函数时出现段错误

javascript - 如何使用 javascript 读取 epub 中的文件内容

c - FILE结构中 `_flag`的意义是什么?

c - 区分字符串和字节数组?

c - 树莓派和OpenCV的C语言库

javascript - 如何使用 Nestjs 和 Multer 读取上传的文件 (text/.csv)

iOS FMDB Sqlite 包装器。内存不足