【问题标题】:Is there any difference between text and binary mode in file access?文件访问中的文本模式和二进制模式有什么区别吗?
【发布时间】:2014-09-13 12:37:56
【问题描述】:

如果我以文本模式而不是二进制模式打开文件有什么区别吗?因为我读到 UNIX 和 Linux 不区分文本文件和二进制文件。

【问题讨论】:

  • 对于 unix 没有区别。 (文本与二进制只是微软的产物)
  • 不仅,AFAIK 符合 C99 标准规范。
  • 并非所有“文本”文件都会通过 CR/LF 翻译被正确读取;只有那些以 ASCII(或接近的派生词或扩展名)编码的才会是。可以说,以 EBCDIC 编码的文本文件是“文本文件”,因此这至少需要对所使用的编码进行一些定义。此外,CR/LF 翻译可能会弄乱 16 位 Unicode 文本文件。可以说一个单独的“文本模式”实际上已经过时了。
  • @wlidplasser:我认为一些旧版本的 MacOS 也关心二进制与文本? (但我不知道MacOS9)
  • IIR,一些系统在二进制与文本模式下的另一个区别是EOF。在文本模式下,'^Z' 不会被读取为char,但会触发EOF 条件。写入文件并关闭文件时将应用'^Z'。即使是一个旧系统也可以区分其在文本/二进制模式下的行缓冲——但我怀疑它是否非常符合 C 语言。许多操作系统确实(仍然如此?)区分。如果您希望您的代码与非 *nix 系统不兼容,请忽略 text/binary 设置。

标签: c linux unix file-io


【解决方案1】:

在 Linux 上没有区别(至少在像 Ext4 这样的本机文件系统和大多数其他文件系统上也是如此,使用通常的 GNU libc)。

也许一些奇怪的文件系统可能有一个特定的标志来打开不同的二进制或文本文件。我不知道这样的文件系统。也许你可以编写一些 FUSE 文件系统来区分,也许在一个奇怪的自定义 libc 中围绕 fopen 进行一些额外的修改

但是,C99 standard(至少第 271 页,n1256 草案的第 7.19.5.3 节)明确提到了文本与二进制模式,因此如果您的程序符合标准。

所以我的意思是,您可能想尝试将模式字符串传递给fopen,以区分二进制与文本模式。 (我同意我不经常这样做)。不会痛的。

Linux fopen(3) 手册页明确指出:

模式字符串也可以包含字母“b”作为最后一个 字符或作为两个字符之间的字符- 上述字符串。这是严格的 与 C89 兼容并且没有效果; 'b' 被忽略 符合 POSIX 标准的系统,包括 Linux。 (其他系统可能会处理 文本文件和二进制文件不同,添加“b”可能是 如果您对二进制文件执行 I/O 并期望您的程序 可以移植到非 UNIX 环境。)

当然,open(2) 系统调用没有任何方式传输模式标志。 (你可能需要一些 private ioctl(2)

【讨论】:

  • 文件系统在这里不相关。 FS 对块进行操作。 CR/LF(如果有的话)的翻译/解释是在 libc 级别完成的。 (getc, fgets, fread, fseek (!) ftell(!) , ...)
  • 原则上你是对的,但我猜一些 FUSE 文件系统可能会做不同的事情,例如将\r\n 转换为\n ....!
  • 我不知道 FUSE 文件系统。 [不要以为我愿意。 用火杀死它... ]
  • 啊哈,以前叫loop FS,IIRC。
猜你喜欢
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
相关资源
最近更新 更多