gpt4 book ai didi

file - 为什么文本文件应该以换行符结尾?

转载 作者:行者123 更新时间:2023-12-03 03:51:25 33 4
gpt4 key购买 nike

我想这里的每个人都熟悉这句格言:所有文本文件都应该以换行符结尾。我多年来一直知道这个“规则”,但我一直想知道 - 为什么?

最佳答案

因为that’s how the POSIX standard defines a line :

3.206 Line
A sequence of zero or more non- <newline> characters plus a terminating <newline> character.

因此,不以换行符结尾的“行”不被视为实际行。这就是为什么某些程序在处理文件的最后一行(如果它不是换行符终止)时会出现问题的原因。

遵循此约定的优点是所有 POSIX 工具都期望并使用它。例如,当使用 cat 连接文件时,以换行符结尾的文件(下面的 a.txtc.txt)将产生不同的效果与没有 (b.txt) 的相比:

<i>$</i> <b>more</b> a.txt
foo

<i>$</i> <b>more</b> b.txt
bar
<i>$</i> <b>more</b> c.txt
baz

<i>$</i> <b>cat</b> {a,b,c}.txt
foo
barbaz

为了保持一致性,我们遵循此规则。否则在处理默认 POSIX 工具时会产生额外的工作。

<小时/>

换个角度思考:如果行不是以换行符终止的,那么使诸如 cat 这样的命令变得有用就困难得多:如何创建一个命令来连接文件,使得

  1. 它将每个文件的开头放在一个新行上,这在 95% 的情况下都是您想要的;但是
  2. 它允许合并两个文件的最后一行和第一行,如上面的 b.txtc.txt 之间的示例?

当然,这是可以解决的,但您需要使cat的使用更加复杂(通过添加位置命令行参数,例如cat a.txt - -no-newline b.txt c.txt),现在由命令而不是每个单独的文件控制如何与其他文件粘贴在一起。这几乎肯定不方便。

...或者您需要引入一个特殊的哨兵字符来标记应该继续而不是终止的行。好吧,现在你遇到了与 POSIX 相同的情况,除了倒置(行继续符而不是行终止符)。

<小时/>

现在,在不兼容 POSIX 的系统(现在主要是 Windows)上,这一点没有实际意义:文件通常不以换行符结尾,并且 (非正式的) 定义例如,line 可能是“由换行符分隔的文本”(注意重点)。这是完全正确的。然而,对于结构化数据(例如编程代码),它使解析变得更加复杂:这通常意味着必须重写解析器。如果解析器最初是根据 POSIX 定义编写的,那么修改 token 流而不是解析器可能更容易 - 换句话说,在输入末尾添加“人工换行” token 。

关于file - 为什么文本文件应该以换行符结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/729692/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com