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

问题描述 投票:0回答:1

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

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

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

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

c file io text-files binaryfiles
1个回答
8
投票

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
可能对于打开的二进制文件更有用在二进制模式下。

© www.soinside.com 2019 - 2024. All rights reserved.