为啥我必须费心在每个文件的末尾添加换行符?

Posted

技术标签:

【中文标题】为啥我必须费心在每个文件的末尾添加换行符?【英文标题】:Why should I have to bother putting a linefeed at the end of every file?为什么我必须费心在每个文件的末尾添加换行符? 【发布时间】:2011-03-05 23:57:15 【问题描述】:

我偶尔会遇到一些软件(包括编译器)拒绝接受或正确处理未以换行符正确终止的文本文件。我什至遇到过明显的表单错误,

文件末尾没有换行符

...这似乎表明他们明确地检查这种情况,然后因为固执而拒绝它。

我在这里遗漏了什么吗?为什么会 - 或者应该 - 关心文件是否以看似多余的空格结尾?

【问题讨论】:

原来是这样的? 【参考方案1】:

从历史上看,至少在 Unix 世界中,“换行符”或更确切地说是 U+000A 换行符是行终止符。这与例如 Windows 中的做法形成鲜明对比,其中 CR+LF 是行分隔符

读取文件中每一行的简单解决方案是将字符附加到缓冲区,直到遇到 LF。如果这样做真的很愚蠢,如果文件没有被 LF 终止,这将忽略文件中的最后一行。

要考虑的另一件事是允许包含文件的宏系统。一行如

%include "foo.inc"

可能会被上述文件的内容替换,如果最后一行没有以 LF 结尾,它将与下一行合并。是的,我已经在嵌入式平台的特定宏汇编器中看到了这种行为。

如今,我坚信 (a) 它是远古时代的遗物,并且 (b) 我还没有见过无法处理它的现代软件,但我们仍然带着许多类似 Unix 的编辑器有助于在文件末尾多放一个字节的系统。

【讨论】:

【参考方案2】:

通常我会说源文件末尾缺少换行符意味着编辑器或源代码控制客户端出现问题,并且缓冲区中的所有代码都没有被刷新。虽然这可能会导致其他错误,但知道编辑器/SCM 中可能出现问题并且代码可能丢失是非常有用的知识。当然,我想检查一下。

【讨论】:

从技术上讲,这样的错误应该由 SCM 检测/防止。由于使用源代码,缓冲区端意外命中行尾的可能性并不那么小,因此无论如何它都不是一个特别有用的指标。在任何情况下,我都不相信会经常破坏我的文件的 SCM。

以上是关于为啥我必须费心在每个文件的末尾添加换行符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥建议在源文件末尾有空行?

为啥我的 Linux 文本文件(使用 echo 创建)以换行符结尾?我怎样才能删除它? [复制]

在 bash 文件末尾添加换行符

“文件末尾没有换行符”日志的意义是啥?

Bash:将字符串添加到文件末尾而不换行

如果在文件末尾省略PHP块的结束标记,是否会删除任何换行符或空格(如果存在于相应的文件中)?