8

在 Windows 中,当您\r\n以文本模式从文件(或标准输入)中读取字符时,\r会被删除并且您只能读取\n.

有没有应该这样的标准?

我可以确定它适用于 Windows 上的任何编译器吗?其他平台特定的字符组合是否也会\n在这些平台上被替换?

我使用此代码生成输入并使用此代码读取它。结果在这里。你可能会注意到一些错过\r

4

1 回答 1

16

是的,这来自与 C 的兼容性。在 C 文本流中,行由换行符终止。这是程序看到的文本流的内部表示。I/O 库在内部表示和一些外部表示之间进行转换。

内部表示与平台无关,而文本有不同的特定于平台的约定。这就是在流库中拥有文本模式的意义所在;可以编写可移植的文本操作程序,这些程序不必包含一堆#ifdef指令以在不同的平台上工作,或者构建自己的平台无关的文本抽象。

碰巧 C 文本流的内部表示与文本文件的本机 Unix 表示相匹配,因为 C 语言及其库起源于 Unix。为了将 C 程序移植到其他平台,添加了文本流抽象,使非 Unix 系统上的文本文件看起来像 Unix 文本文件。

在 ISO/IEC 9899:1999 标准(“C99”)中,我们有这个:

7.19.2 流

[...]

文本流是组成行的有序字符序列,每行由零个或多个字符加上一个终止换行符组成。最后一行是否需要终止换行符是实现定义的。可能必须在输入和输出上添加、更改或删除字符,以符合在主机环境中表示文本的不同约定。因此,流中的字符与外部表示中的字符之间不需要一一对应。

大胆强调我的。C++ 流是根据 C 流定义的。C++ 标准中没有对文本模式与二进制模式的解释,除了将各种流模式标志组合映射到适合作为模式参数的字符串的表之外fopen

于 2013-06-28T19:01:04.853 回答