为什么在 Unix 上打开文件进行二进制访问是“没有意义的”,读/写的“+”也是如此?

为什么在 Unix 上打开文件进行二进制访问是“没有意义的”,读/写的“+”也是如此?

我正在阅读《C 编程语言》(第二版)。在第157页和第158页作者给出了fopenUnix系统中的代码片段。作者在片段末尾添加了:

特别是,我们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 编程语言发生了一些变化。

相关内容