我尝试在C中使用fopen,第二个参数是打开模式。两种模式“r”和“rb”往往让我很困惑。看来它们是一样的。但有时候使用“rb”会更好。那么,为什么“r”存在? 请向我详细解释或通过示例解释。 谢谢。
答案 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)
这至少在Windows上有所不同。有关详细信息,请参阅该链接。
答案 4 :(得分:2)
在大多数POSIX系统上,它被忽略。但是,请检查您的系统以确定。
XNU
模式字符串还可以包含字母' b'或者作为最后一个字符,或者作为上述任何两个字符串中的字符之间的字符。这严格要求与ISO / IEC 9899:1990(' ISO C90')兼容,并且没有效果; ''被忽略了。
Linux的
模式字符串还可以包含字母' b'要么作为最后一个 字符或作为两者中任何一个字符之间的字符 - 上面描述的字符串。这是严格的 与C89的兼容性并没有效果; ''被忽略了 符合POSIX标准的系统,包括Linux。 (其他系统可能会对待 文本文件和二进制文件的方式不同,并添加' b'可能是一个 如果您对二进制文件执行I / O并期望您的程序,那么这是个好主意 可以移植到非UNIX环境。)