我想这里的每个人都熟悉这句谚语,即所有文本文件都应该以换行符结尾。我已经知道这个“规则”很多年了,但我一直在想——为什么?


当前回答

基本上,如果没有得到最终EOL EOF,许多程序将无法正确处理文件。

GCC警告您这一点,因为它是C标准的一部分。(第5.1.1.2节明显)

“文件末尾没有换行符”编译器警告

其他回答

天啊,这是个人风格和观点的问题。

在过去,我没有写那句新语。保存的字符意味着14.4K调制解调器的速度更快。

稍后,我放置了换行符,以便使用shift+向下箭头更容易选择最后一行。

这可能与以下两者之间的差异有关:

文本文件(每行应该以行尾结尾)二进制文件(没有真正的“行”可言,必须保留文件的长度)

如果每一行都以行尾结尾,这就避免了,例如,连接两个文本文件会使第一行的最后一行与第二行的第一行对齐。

此外,编辑器可以在加载时检查文件是否以行尾结尾,将其保存在本地选项“eol”中,并在写入文件时使用该选项。

几年前(2005年),许多编辑(ZDE、Eclipse、Scite…)确实“忘记”了最后的EOL,这并不是很受欢迎。不仅如此,他们还错误地将最后的EOL解释为“开始一行”,实际上开始显示另一行,就好像它已经存在一样。与在上述编辑器之一中打开文本文件相比,这在“适当”的文本文件中是非常明显的,该文件具有良好的文本编辑器(如vim)。它在文件的最后一行下面显示了一行。你会看到这样的情况:

1 first line
2 middle line
3 last line
4

一个单独的用例:当文本文件受版本控制时,提交卫生。

如果将内容添加到文件末尾,则先前是最后一行的行将被编辑为包含换行符。这意味着,打开文件以了解该行最后一次编辑的时间将显示换行符添加,而不是您实际希望看到的提交。

(该示例特定于git,但同样的方法也适用于其他版本控制系统。)

现在已经很晚了,但我在文件处理中遇到了一个错误,这是因为文件没有以空换行结尾。我们使用sed处理文本文件,sed省略了输出的最后一行,这导致无效的json结构,并将流程的其余部分发送到失败状态。

我们所做的就是:

有一个示例文件,比如:foo.txt,其中包含一些json内容。

[{
    someProp: value
},
{
    someProp: value
}] <-- No newline here

该文件是在寡妇计算机中创建的,窗口脚本正在使用PowerShell命令处理该文件。一切都很好。

当我们使用sed命令sed的|value|newValue|g'foo.txt>foo.txt.tmp处理同一文件时

新生成的文件是

[{
    someProp: value
},
{
    someProp: value

和boom,由于无效的JSON,它使其余过程失败。

因此,用空的新行结束文件始终是一个好的做法。

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

因为这是最明智的选择。

获取包含以下内容的文件:,

one\n
two\n
three

其中,\n表示换行符,在Windows上是返回字符,\r\n后跟换行符,因为它很酷,对吗?

这个文件有多少行?Windows说3,我们说3,POSIX(Linux)说文件是残缺的,因为文件末尾应该有一个。

无论如何,你会说它的最后一行是什么?我想任何人都同意三行是文件的最后一行,但POSIX表示这是一个残缺的行。

第二行是什么?哦,这里有第一个强烈的分离:

Windows说两个是因为文件是“用换行符分隔的行”(wth?);POSIX说2,并补充说这是一条真实、诚实的路线。

那么,选择Windows的后果是什么?简单:

你不能说文件是由行组成的

为什么?尝试从上一个文件中取出最后一行并复制几次。。。你得到了什么?这:

one\n
two\n
threethreethreethree

相反,尝试交换第二行和第三行。。。你会发现:

one\n
threetwo\n

因此

您必须说,文本文件是行和\n的交替,以行开始,以行结束

这真是一口,对吧?

你想要另一个奇怪的结果?

你必须接受一个空文件(0字节,实际上是0位)是一个单行文件,神奇的是,因为它们在微软很酷

这真是太疯狂了,你不觉得吗?

POSIX选择的后果是什么?

顶部的文件有点残缺,我们需要一些黑客来处理它。

是认真的

在前面的文本中,我是挑衅性的,因为处理缺少结尾的文本文件会迫使您使用特殊的滴答声/黑客来处理它们。你总是需要一个if/else来让事情运转起来,其中处理残缺行的分支只处理残缺行,所有其他行都采用另一个分支。这有点种族主义,不是吗?

我的结论

我赞成POSIX对行的定义,原因如下:

文件自然被认为是一系列行一行不应该是这样或那样的,这取决于它在文件中的位置空文件不是单行文件,拜托!您不应该被迫对代码进行黑客攻击


是的,Windows确实鼓励您省略后面的\r\n。如果需要下面的两行文件,则必须省略尾部,否则文本编辑器会将其显示为三行文件: