【发布时间】:2011-01-11 14:32:22
【问题描述】:
我尝试在C中使用fopen,第二个参数是打开模式。 “r”和“rb”这两种模式往往让我很困惑。看来他们是一样的。但有时最好使用“rb”。那么,为什么“r”存在呢? 详细或举例说明给我听。 谢谢。
【问题讨论】:
我尝试在C中使用fopen,第二个参数是打开模式。 “r”和“rb”这两种模式往往让我很困惑。看来他们是一样的。但有时最好使用“rb”。那么,为什么“r”存在呢? 详细或举例说明给我听。 谢谢。
【问题讨论】:
您应该使用"r" 打开文本文件。不同的操作系统存储文本的方式略有不同,这将执行正确的翻译,因此您无需了解本地操作系统的特性。例如,您将知道换行符将始终显示为简单的"\n",无论代码在何处运行。
如果您打开非文本文件,您应该使用"rb",因为在这种情况下,翻译不合适。
【讨论】:
\r\n 处理为 \n。
"r" 将在同一系统上正确打开一个“文本文件”。如果您在 Linux 上使用 "r" 打开 Windows 文本文件,当然,您必须自己处理不同的行尾约定。
dos2unix 的程序轻松完成此操作,或者在vim 中打开文件后键入:se ff=unix,按回车键,然后保存。
"r" 用于打开本地自定义定义的文本文件——即在 Linux 上打开 Linux 文本文件、在 Windows 上打开 Windows 文本文件和在 OS/390 上打开 OS/390 文本文件。如果您要在 PC 之间移动文本文件,则由您决定将它们翻译成原生格式。
plus 示例.....
在 Linux 和一般的 Unix 上,"r" 和 "rb" 是相同的。更具体地说,通过fopen()在文本模式和二进制模式下的文件获得的FILE 指针在Unix 上的行为方式相同。在 Windows 上,一般来说,在使用多个字符表示“newlines”的系统上,以文本模式打开的文件的行为就像所有这些字符都只是一个字符,'\n'。
如果您想在任何系统上可移植地读/写文本文件,请使用"r" 和fopen() 中的"w"。这将保证文件被正确写入和读取。如果您要打开二进制文件,请使用"rb" 和"wb",这样不幸的换行翻译不会弄乱您的数据。
请注意,底层系统为您进行换行转换的结果是您无法确定使用fseek(file, 0, SEEK_END) 从文件中读取的字节数。
最后,在comp.lang.c FAQs 上查看What's the difference between text and binary I/O?。
【讨论】:
\r\n 或\r 而不是\n。最后,是文件本身的内容有所不同,而不是系统。
使用“rb”打开一个二进制文件。那么文件的字节在你读取时不会被编码
【讨论】:
这至少在 Windows 上有所不同。有关详细信息,请参阅该链接。
【讨论】:
在大多数 POSIX 系统上,它被忽略。但是,请检查您的系统以确定。
XNU
模式字符串还可以包含字母“b”作为最后一个字符或作为上述任何两个字符串中的字符之间的字符。这完全是为了与 ISO/IEC 9899:1990(“ISO C90”)兼容,没有任何效果; 'b' 被忽略。
Linux
模式字符串也可以包含字母“b”作为最后一个 字符或作为两个字符之间的字符- 上述字符串。这是严格的 与 C89 兼容并且没有效果; 'b' 被忽略 符合 POSIX 标准的系统,包括 Linux。 (其他系统可能会处理 文本文件和二进制文件不同,添加“b”可能是 如果您对二进制文件执行 I/O 并期望您的程序 可以移植到非 UNIX 环境。)
【讨论】: