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

时间:2013-06-28 18:53:18

标签: c++ windows c++11 io language-lawyer

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

是否存在应该如此的标准?

我可以确定Windows上的任何编译器都适用吗?在这些平台上,其他平台特定的字符组合是否会被\n取代?

我使用this code生成输入并使用this code来读取它。结果是here。你可能会注意到很少有人错过\r

1 个答案:

答案 0 :(得分:15)

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

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

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

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

  

7.19.2 Streams

     

[...]

     

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

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