我正在用 C 语言进行文件管理培训,我看到有很多方法可以使用 fopen 使用 a、r 等字词打开文件。一切都好,但我还读到,如果在那个词中添加 b 那变成二进制文件。这是什么意思?与普通文件有哪些区别?
5 回答
以文本模式打开文件会导致 C 库执行一些特定于文本的处理。例如,Windows 和 Unix/linux 之间的新行不同,但您可以简单地写 '\n' 因为 C 正在为您处理这种差异。
以二进制模式打开文件不会进行任何这种特殊处理,它只是将其视为原始字节。在C FAQ上有一个更长的解释
请注意,这只在 Windows 上很重要;Unix/linux 系统不需要(需要)区分文本和二进制模式,尽管您可以包含 'b' 标志而不会抱怨。
如果您以二进制模式打开一个常规文件,您将按原样获取其所有数据,并且您写入其中的任何内容都会出现在其中。
OTOH,如果您以文本模式打开常规文件,则行尾之类的内容会得到特殊处理。例如,值为 13 ( CR
or '\r'
) 和 10 ( LF
or '\n'
) 的字节序列在读取时可以被截断为一个字节,10,或者在写入时 10 可以扩展为 13,然后是 10。这种处理是特定于平台的(读取、编译器/操作系统特定)。
对于文本文件,这通常并不重要。但是,如果您将文本模式应用于非文本文件,则会面临数据损坏的风险。
此外,由于这种特殊处理,不支持在以文本模式打开的文件中以任意偏移量读取和写入字节。
区别在这里解释
二进制文件是一系列 1 和 0。这被称为机器语言,因为微处理器可以通过发送 1 的信号或不发送 0 的信号来解释这一点。这更紧凑,但人类无法阅读。
出于这个原因,文本文件是一串二进制信号,被指定为显示为对人更友好的字符,它们比二进制更适合语言。ASCII 就是这样一种名称的一个例子。这揭示了事情的真相:所有文件都是最低级别的二进制文件。
但是,二进制适用于任何对我们卑贱的人来说文本可读的应用程序 =] 首选二进制文件的示例应用程序是声音文件、图像和编译程序。二进制比文本更受欢迎的原因是,用机器语言描述图像比用文本描述图像更有效(无论如何都必须翻译成机器语言)。
有两种类型的文件:文本文件和二进制文件。
二进制文件有两个区别于文本文件的特性: 您可以立即跳转到文件中的任何记录,这提供了像数组一样的随机访问;您可以随时更改文件中任何位置的记录内容。二进制文件通常也比文本文件具有更快的读写时间,因为记录的二进制图像直接从内存存储到磁盘(反之亦然)。在文本文件中,所有内容都必须来回转换为文本,这需要时间。
更多信息在这里
b
用于处理二进制文件。但是,这对 POSIX 兼容的操作系统没有影响。
来自 fopen 的联机帮助页:
The mode string can also include the letter 'b' either as a last char‐
acter or as a character between the characters in any of the two-char‐
acter strings described above. This is strictly for compatibility with
C89 and has no effect; the 'b' is ignored on all POSIX conforming sys‐
tems, including Linux. (Other systems may treat text files and binary
files differently, and adding the 'b' may be a good idea if you do I/O
to a binary file and expect that your program may be ported to non-UNIX
environments.)