文件访问中的文本和二进制模式有什么区别吗?

kod*_*r16 6 c unix linux file-io

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

Bas*_*tch 6

在Linux上没有任何区别(至少在像Ext4这样的原生文件系统上以及在大多数其他文件系统上,使用通常的GNU libc).

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

但是,C99标准(至少第271页,n1256草案的第7.19.5.3节)明确提到了文本与二进制模式,因此如果符合标准,您的程序将更容易移植到其他系统(如Windows).

所以我的观点是你可能想尝试传递一个模式字符串,fopen以区分二进制文件模式和文本模式.(我同意我不经常这样做).它不会受伤.

Linux fopen(3)手册页明确说:

模式字符串还可以包括字母"b"作为最后一个字符或者作为上述任何两个字符串中的字符之间的字符.这完全是为了与C89兼容而没有效果; 所有符合POSIX标准的系统(包括Linux)都会忽略'b'.(其他系统可能会以不同方式处理文本文件和二进制文件,如果您对二进制文件执行I/O并且期望您的程序可能移植到非UNIX环境,则添加"b"可能是一个好主意.)

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

  • 这里的文件系统不相关.FS在块上运行.CR/LF(如果有的话)的翻译/解释是在libc级别完成的.(getc,fgets,fread,fseek(!)ftell(!),...) (2认同)