R 和 rb 在 fopen 中的区别是什么

我尝试在 C 语言中使用 fopen,第二个参数是 open 模式。两种模式“ r”和“ rb”让我很困惑。看起来他们是一样的。但有时使用“ rb”更好。那么,为什么“ r”会存在呢? 给我详细解释一下,或者举个例子。 谢谢你。

178673 次浏览

您应该使用 "r"打开文本文件。不同的操作系统存储文本的方式略有不同,这将执行正确的翻译,因此您不需要了解本地操作系统的特性。例如,您将知道,不管代码在哪里运行,换行总是以简单的 "\n"的形式出现。

如果要打开非文本文件,应该使用 "rb",因为在这种情况下,翻译是不合适的。

使用“ rb”打开一个二进制文件。那么当你读取文件时,它们的字节不会被编码

  • “ r”与 翻译模式的“ rt”相同
  • “ rb”是 非翻译模式非翻译模式。

这至少在 Windows 上有所不同。

在 Linux 和一般的 Unix 上,"r""rb"是相同的。更具体地说,通过 fopen()ing 以文本模式和二进制模式获得的 FILE指针在 Unix 上的行为是相同的。在 Windows 上,以及一般情况下,在使用多个字符表示“ 新台词”的系统上,以文本模式打开的文件表现得好像所有这些字符都只是一个字符 '\n'

如果希望在任何系统上可移植地读/写文本文件,请使用 fopen()中的 "r""w"。这将保证正确地写入和读取文件。如果要打开二进制文件,请使用 "rb""wb",这样不幸的换行转换就不会弄乱数据。

注意,底层系统为您执行换行转换的结果是,您无法确定使用 Fsearch (文件,0,SEEK _ END)可以从文件读取的字节数。

最后,请参阅 Com.lang.c 常见问题上的 文本和二进制 I/O 有什么区别?

在大多数 POSIX 系统中,它被忽略。但是,请检查您的系统以确保。

XNU

模式字符串还可以包括字母‘ b’,或者作为最后一个字符,或者作为上述任何两个字符字符串中字符之间的一个字符。这完全是为了与 ISO/IEC 9899:1990(‘ ISO C90’)兼容,并且没有效果; 忽略‘ b’。

Linux

模式字符串也可以包括字母‘ b’作为最后一个 字符或作为两个字符中任何一个字符之间的字符- 上面描述的字符串 与 C89兼容并且没有效果; 在所有 符合 POSIX 的系统,包括 Linux 文本文件和二进制文件不同,并添加“ b”可能是一个 如果您对二进制文件进行 I/O 操作,并且希望您的程序 可以移植到非 UNIX 环境。)