r和rb在fopen中有什么区别?

我尝试在C中使用fopen,第二个参数是打开模式。 “r”和“rb”这两种模式往往使我困惑不已。 看来他们是一样的。 但有时使用“rb”更好。 那么,为什么“r”存在? 向我详细解释或举例。 谢谢。

您应该使用"r"打开文本文件。 不同的操作系统存储文本的方式略有不同,这将执行正确的翻译,因此您不需要知道本地操作系统的特性。 例如,你将会知道换行符总是显示为一个简单的"\n" ,而不pipe代码在哪里运行。

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

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

如果你想在任何系统上移植读写文本文件,在fopen()使用"r""w" 。 这将保证文件被正确写入和读取。 如果你打开一个二进制文件,使用"rb""wb" ,这样一个不幸的新行翻译不会混淆你的数据。

请注意,底层系统为您执行换行转换的结果是,您无法确定使用fseek(file,0,SEEK_END)从文件中读取的字节数。

最后,看看文本和二进制I / O有什么区别? 在comp.lang.c常见问题 。

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

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

这至less在Windows上有所不同。 详细信息请参阅该链接。

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

XNU

模式string还可以包括字母“b”作为最后一个字符,或者作为上述任何一个双字符字符中的字符之间的字符。 这严格符合ISO / IEC 9899:1990('ISO C90')的要求,不起作用; 'b'被忽略。

Linux的

模式string还可以包括字母“b”,作为最后一个字符或者作为上述两个string中的字符之间的字符。 这是严格的与C89兼容,并没有任何影响; 在包括Linux在内的所有符合POSIX标准的系统中,“b”被忽略。 (其他系统可能会以不同的方式处理文本文件和二进制文件,如果您对二进制文件执行I / O操作并希望将程序移植到非UNIX环境中,则添加'b'可能是一个好主意。