为啥 CR LF 在 Windows 中改为 LF?
Posted
技术标签:
【中文标题】为啥 CR LF 在 Windows 中改为 LF?【英文标题】:Why CR LF is changed to LF in Windows?为什么 CR LF 在 Windows 中改为 LF? 【发布时间】:2013-06-26 15:20:52 【问题描述】:在 Windows 中,当您以文本模式从文件(或标准输入)中读取字符 \r\n
时,\r
会被删除,而您只能读取 \n
。
有没有一个标准应该这样?
我能否确定它适用于 Windows 上的任何编译器?在这些平台上,其他特定于平台的字符组合是否也会被 \n
取代?
我使用this code 生成输入并使用this code 读取它。结果为here。您可能会注意到一些错过的\r
's
【问题讨论】:
@JohnDibling 干什么用的? 因为它可能完全取决于您调用的read
/fscanf
/operator<<
函数。
@JohnDibling,input generator,我如何从中读到:ideone.com/0XTfH6。 Result。您可能会注意到一些错过的\r
's
对于困惑的人,标签[language-lawyer]
对这个问题很重要。这个问题不是关于“为什么会发生”,而是“根据标准中的哪个条款,这件事的发生是合理的?”
【参考方案1】:
是的,这来自与 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++11 草稿中搜索“\n”,但没有找到任何相关信息 @RiaD:请注意,这里 Kaz 所指的标准 (n1256) 是 C 标准,而不是 C++ 标准。 @RiaD 令人惊讶的是,C++ 标准中没有任何内容(我正在查看的最后一个 C++11 草案)。 C++ 流具有binary
模式,但并未真正描述。他们所做的只是将各种 C++ 流模式映射到 fopen
标志!因此,假定文本流的规范来自 C 标准。阅读 C++ 标准的人应该熟悉 C 流,或者阅读 C 标准以复习它们。
@Kaz:C++ 标准还在某处(现在无法引用)说,如果两个标准之间存在任何冲突,C++ 会获胜。至于为什么有些东西在两者中定义相同,我不知道。
C++ 从 C 获取二进制/文本模式行为,因为 basic_filebuf<>::open()
行为是根据 C 的 fopen()
函数定义的(参见 C++11 27.9.1.4)。以上是关于为啥 CR LF 在 Windows 中改为 LF?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法让 Aginity Workbench 编写 Unix 文件而不是 Windows 文件(仅 LF 而不是 CR\LF)