fopen中r和rb之间的区别是什么?

时间:2010-02-01 05:47:41

标签: c windows linux file

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

5 个答案:

答案 0 :(得分:66)

您应该使用"r"打开文本文件。不同的操作系统存储文本的方式略有不同,这将执行正确的翻译,因此您无需了解本地操作系统的特性。例如,无论代码在何处运行,您都会知道换行符始终显示为简单的"\n"

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

答案 1 :(得分:28)

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

如果您想在任何系统上轻松读取/写入文本文件,请在"r"中使用"w"fopen()。这将保证文件的正确写入和读取。如果您要打开二进制文件,请使用"rb""wb",这样一个不幸的换行符不会弄乱您的数据。

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

最后,请参阅What's the difference between text and binary I/O?上的comp.lang.c FAQs

答案 2 :(得分:8)

使用“rb”打开二进制文件。然后,当您阅读它们时,文件的字节将不会被编码

答案 3 :(得分:7)

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

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

答案 4 :(得分:2)

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

XNU

  

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

Linux的

  

模式字符串还可以包含字母' b'要么作为最后一个   字符或作为两者中任何一个字符之间的字符 -   上面描述的字符串。这是严格的   与C89的兼容性并没有效果; ''被忽略了   符合POSIX标准的系统,包括Linux。 (其他系统可能会对待   文本文件和二进制文件的方式不同,并添加' b'可能是一个   如果您对二进制文件执行I / O并期望您的程序,那么这是个好主意   可以移植到非UNIX环境。)