在C中以文本或二进制模式打开文件会产生什么后果?

Zar*_*uta 2 c io binaryfiles file text-files

我想知道我们用于在 C 中打开文件的模式(文本或二进制)是否真的很重要。

例如,一般情况下,我们使用fread和fwrite来进行二进制模式的读写。当我们以文本模式打开文件时可以使用这些函数吗?

除此之外,一般情况下,我们可以使用fscanf和fprintf来进行文本模式的读写。如果我们以二进制模式打开文件,可以使用这些函数吗?

以文本或二进制模式打开文件会产生什么后果?

And*_*zel 7

POSIX兼容的操作系统(例如 Linux、MacOS)上,二进制模式和文本模式没有区别。

然而,在 Microsoft Windows 上情况并非如此。

在内部,Microsoft Windows 上的文本文件通常使用\r\n(回车符后跟换行符)来终止行。如果您以二进制模式打开文本文件,您将因此看到\r\n每行的末尾(可能除了最后一行)。另一方面,如果您以文本模式打开文本文件,C 运行时库将自动将所有内容转换\r\n\n.

由于这种转换,有效文件大小(即到达文件末尾之前可以调用的次数fgetc)会有所不同,具体取决于您使用的是文本模式还是二进制模式。

这种转换的另一个后果是,您无法fseek在文本模式下使用该函数来跳转文件中一定数量的字符。这仅在二进制模式下可行。原因是在文本模式下,两个文件位置之间的字节数可能与二进制模式下不同。

Microsoft Windows 上的另一个问题是在文本模式下,字节值'\x1A'被解释为文件结尾。因此,如果您以文本模式打开二进制文件,并且该文件碰巧包含值为 的字节,则该文件可能会比实际长度短很多'\x1A'

但是,除了上述问题之外,您可以在两种模式下随意使用freadfwritefprintf和功能。fscanf但格式化的 I/O 功能fprintf可能fscanf对于以文本模式打开的文本文件更有用,而未格式化的 I/O 功能fread可能fwrite对于以二进制模式打开的二进制文件更有用。