为什么CR LF在Windows中更改为LF?

Ria*_*iaD 7 c++ windows io language-lawyer c++11

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

应该是这样的标准吗?

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

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

Kaz*_*Kaz 15

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

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

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

在ISO/IEC 9899:1999标准("C99")中,我们有:

7.19.2流

[...]

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

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

  • C++ 从 C 获得二进制/文本模式行为,因为 `basic_filebuf<>::open()` 行为是根据 C 的 `fopen()` 函数定义的(请参阅 C++11 27.9.1.4)。 (2认同)