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


当前回答

除了上述实际原因之外,如果Unix的创始人(Thompson、Ritchie等人)或他们的Multics前辈意识到使用行终结符而不是行分隔符是有理论原因的,我也不会感到惊讶:使用行终结器,您可以对所有可能的行文件进行编码。使用行分隔符,零行文件和包含单个空行的文件之间没有区别;它们都被编码为包含零字符的文件。

因此,原因如下:

因为POSIX就是这样定义它的。因为有些工具期望它或没有它的“错误行为”。例如,wc-l不会计算最后的“行”,如果它不以换行结尾。因为它简单方便。在Unix上,cat只起作用,而且没有任何复杂的问题。它只复制每个文件的字节,不需要任何解释。我不认为DOS等同于猫。使用副本a+b c将最终将文件a的最后一行与文件b的第一行合并。因为零行的文件(或流)可以与一个空行的文件区分开来。

其他回答

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

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

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

很可能只是一些解析代码希望它在那里。

我不确定我是否会认为这是一条“规则”,而且这肯定不是我虔诚地遵守的。最明智的代码将知道如何逐行解析文本(包括编码)(任何行结尾的选择),最后一行是否有换行符。

的确,如果你以一条新的线结束:EOL和EOF之间(理论上)是否有一条空的最终线?一个值得思考的。。。

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

正如许多人所表达的,因为:

许多程序运行不好,或者没有它就会失败。即使能很好地处理文件的程序缺少结尾“\n”,该工具的功能也可能无法满足用户的期望——在这种情况下,这一点可能不清楚。程序很少禁止最后的“\n”(我不知道有)。


然而,这引出了下一个问题:

代码应该如何处理没有换行符的文本文件?

最重要的是,不要编写假设文本文件以换行符结尾的代码。假设文件符合某种格式会导致数据损坏、黑客攻击和崩溃。例子://错误的代码while(fgets(buf,buf大小,instream)){//如果没有\n,buf[]被截断,会发生什么buf[strlen(buf)-1]=“\0”;//尝试删除尾部\n...}如果需要最后一个结尾“\n”,请提醒用户该结尾不存在以及所采取的操作。IOW,验证文件的格式。注意:这可能包括对最大行长度、字符编码等的限制。清楚地定义,文档,代码对缺少final“\n”的处理。尽可能不要生成缺少结尾“\n”的文件。

每一行都应该以换行符结尾,包括最后一行。有些程序在处理文件的最后一行时遇到问题,如果它不是换行符。

GCC对此发出警告,并不是因为它无法处理文件,而是因为它必须作为标准的一部分。

C语言标准说非空的源文件应以换行符结尾,换行符前不得紧跟反斜杠字符。由于这是一个“应”条款,我们必须发出一条违反此规则的诊断信息。这在ANSI C 1989标准第2.1.1.2节中。ISO C 1999标准(可能还有ISO C 1990标准)第5.1.1.2节。

参考:GCC/GNU邮件存档。

假设文件正在被处理,而文件仍由另一个进程生成。

可能与此有关?指示文件已准备好处理的标志。