我想知道我们用于在 C 中打开文件的模式(文本或二进制)是否真的很重要。
例如,一般我们使用fread和fwrite来进行二进制模式的读写。当我们以文本模式打开文件时可以使用这些功能吗?
除此之外,一般情况下,我们可以使用fscanf和fprintf来进行文本模式的读写。如果我们以二进制模式打开文件,可以使用这些函数吗?
以文本或二进制模式打开文件会产生什么后果?
在POSIX兼容的操作系统(例如Linux、MacOS)上,二进制模式和文本模式没有区别。
但是,Microsoft Windows 上的情况并非如此。
在内部,Microsoft Windows 上的文本文件通常使用
\r\n
(回车后换行)来终止行。如果您以二进制模式打开文本文件,您将在每行末尾看到 \r\n
(可能除了最后一行)。另一方面,如果您以文本模式打开文本文件,C 运行时库会自动将所有 \r\n
翻译为 \n
。
由于这种转换,有效文件大小(即您可以调用
fgetc
直到到达文件末尾的次数)会有所不同,具体取决于您使用的是文本模式还是二进制模式。
fseek
来跳转文件中一定数量的字符。这仅在二进制模式下可行。原因是在文本模式下,两个文件位置之间的字节数可能与二进制模式下不同。
Microsoft Windows 上的另一个问题是,在文本模式下,字节值
'\x1A'
被解释为文件结尾。因此,如果您以文本模式打开二进制文件,并且该文件碰巧包含值为 '\x1A'
的字节,则该文件可能会比实际长度短很多。
您可以在文本和二进制模式下随意使用
fread
、fwrite
、fprintf
和fscanf
功能。但是格式化的 I/O 函数 fprintf
和 fscanf
对于以文本模式打开的文本文件可能更有用,而未格式化的 I/O 函数 fread
和 fwrite
可能对于打开的二进制文件更有用在二进制模式下。