我正在阅读《C 编程语言》(第二版)。在第157页和第158页作者给出了fopen
Unix系统中的代码片段。作者在片段末尾添加了:
特别是,我们
fopen
无法识别表示二进制访问的“b”,因为那是无意义的在 UNIX 系统上,也不是允许读取和写入的“+”。
为什么作者说它毫无意义呢? (这里提到的“b”和“+”是文件访问模式)
答案1
一些非 Unix 系统以不同的方式处理二进制文件和文本文件。例如,在 DOS、Windows 和 OS/2 下(设计时不相关fopen
,但作为有用的示例),以文本模式打开文件并向其写入将转换“C”约定的行结尾 ( \n
)平台需要的任何内容。在其他系统上,以二进制模式打开文件将导致它在记录中进行处理。这就是fopen
“b”标志控制的内容:不使用它打开的文件将以文本模式打开,使用它打开的文件以二进制模式打开。由于 Unix 风格的系统没有这种区别,因此“b”被忽略(并且不会导致错误)。
我的书没有提到“+”,但我猜fopen
当时不支持它(现在确实如此)。
答案2
根据的 POSIX 规范fopen()
(写那本书时还不存在):
该字符
b
没有任何影响,但允许符合 ISO C 标准。
该b
模式必须被接受,但它对 POSIX 系统没有影响。
此外,该+
模式:
+
当使用更新模式(作为模式参数中的第二个或第三个字符)打开文件时,可以在关联的流上执行输入和输出。
因此,即使在 POSIX 系统上,这也肯定会产生影响。
请注意,自 K&R 书编写以来,C 编程语言发生了一些变化。