在Windows中,当您在文本模式下从文件(或标准输入)中读取字符\r\n
时,\r
会被删除,您只能阅读\n
。
是否存在应该如此的标准?
我可以确定Windows上的任何编译器都适用吗?在这些平台上,其他平台特定的字符组合是否会被\n
取代?
答案 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
模式参数的字符串的表。