fopen中的r和rb有啥区别

Posted

技术标签:

【中文标题】fopen中的r和rb有啥区别【英文标题】:what's the differences between r and rb in fopenfopen中的r和rb有什么区别 【发布时间】:2011-01-11 14:32:22 【问题描述】:

我尝试在C中使用fopen,第二个参数是打开模式。 “r”和“rb”这两种模式往往让我很困惑。看来他们是一样的。但有时最好使用“rb”。那么,为什么“r”存在呢? 详细或举例说明给我听。 谢谢。

【问题讨论】:

读写二进制c-faq.com/stdio/textvsbinary.html 【参考方案1】:

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

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

【讨论】:

这取决于平台。在 Unix 上,文本模式没有什么特别的,所以它仍然不能将 \r\n 处理为 \n 这个想法是"r" 将在同一系统上正确打开一个“文本文件”。如果您在 Linux 上使用 "r" 打开 Windows 文本文件,当然,您必须自己处理不同的行尾约定。 如果您在 linux 系统上打开用 Windows 编写的文件,您将看到该行为。您需要将文件转换为 unix 文本文件。您可以使用名为dos2unix 的程序轻松完成此操作,或者在vim 中打开文件后键入:se ff=unix,按回车键,然后保存。 是的。正如 Alok 所说,"r" 用于打开本地自定义定义的文本文件——即在 Linux 上打开 Linux 文本文件、在 Windows 上打开 Windows 文本文件和在 OS/390 上打开 OS/390 文本文件。如果您要在 PC 之间移动文本文件,则由您决定将它们翻译成原生格式。 @caf,我所有的文件和操作都是窗口类型的...你可以试试我的plus 示例.....【参考方案2】:

在 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?。

【讨论】:

我认为这种思维方式可能存在一些警告。执行程序的系统可能是 Linux,但打开的文件可能是在其他地方创建的。想象一下,您正在编写一个服务器程序代码。服务器本身可能运行 Linux,但将文件上传到服务器的最终用户可能使用的是 Windows。在这种情况下,文件可能包含\r\n\r 而不是\n。最后,是文件本身的内容有所不同,而不是系统。【参考方案3】:

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

【讨论】:

【参考方案4】: “r”与Translated mode的“rt”相同 “rb”是 非翻译模式。

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

【讨论】:

【参考方案5】:

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

XNU

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

Linux

模式字符串也可以包含字母“b”作为最后一个 字符或作为两个字符之间的字符- 上述字符串。这是严格的 与 C89 兼容并且没有效果; 'b' 被忽略 符合 POSIX 标准的系统,包括 Linux。 (其他系统可能会处理 文本文件和二进制文件不同,添加“b”可能是 如果您对二进制文件执行 I/O 并期望您的程序 可以移植到非 UNIX 环境。)

【讨论】:

以上是关于fopen中的r和rb有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

fopen 函数中的 a 和 a+ 选项有啥区别?

c语言中,再对文件的操作模式中,a和a+、w和w+、r和r+有啥区别?

鞋子中MD,RB,TPU,PU,EVA,各有啥区别?

Python 中的 !r 和 %r 有啥区别?

fopen中r+和w+的区别

R中的()和[]有啥区别[关闭]