为什么建议在文件末尾有空行?

时间:2010-02-18 10:52:08

标签: language-agnostic coding-style eof

一些代码样式工具推荐这个,我记得看到一些unix命令行工具警告缺少空行。

有多余的空行是什么原因?

9 个答案:

答案 0 :(得分:150)

如果文本文件中的最后一行数据没有以换行符或回车符/新行组合终止,则许多旧工具行为异常。他们忽略该行,因为它以^ Z(eof)结束。

答案 1 :(得分:36)

如果您尝试将两个文本文件连接在一起,如果第一个文本文件以换行符结尾,您会更高兴。

答案 2 :(得分:34)

除了在文本编辑器中移动到文件末尾时,它是一个更好的光标位置。

在文件末尾添加换行符可以简单地检查文件是否已被截断。

答案 3 :(得分:16)

如果您按照与Why does Python allow a trailing comma in list?

相同的推理追加到文件,也可以为更清晰的差异做出参数

答案 4 :(得分:15)

出现文件末尾的空行,以便输入流的标准读取将知道何时终止读取,通常返回EOF以指示您已到达结尾。大多数语言都可以处理EOF标记。从那时起,在DOS下,EOF标记是F6键或Ctrl-Z,对于* nix系统,它是Ctrl-D。

大多数(如果不是全部)实际上会读到EOF标记,以便运行时库从输入读取的功能将知道何时停止读取。当你打开追加模式的流时,它将擦除EOF标记并写过它,直到明确调用一个关闭它将在那时插入EOF标记。

旧工具期待空行,然后是EOF标记。如今,工具可以处理空行并忽略它。

答案 5 :(得分:8)

此外,当您修改文件并在文件末尾附加一些代码时 - diff(至少在标准配置中使用git diff)将显示您更改了最后一行,而您实际上唯一做过的事情 - 添加了换行符符号。所以cvs报告变得不那么方便了。

答案 6 :(得分:4)

某些语言根据输入行定义其输入文件,其中每个输入行是由回车符终止的一系列字符。如果他们的语法是这样定义的,那么文件的最后一个有效行也必须通过回车来终止。

答案 7 :(得分:1)

这是因为定义了文本文件。在任何UNIX环境中创建新文本文件时,该文件的内容均为new line character'\ n'

否则,该文件将不会真正识别为文本文件。现在,一旦我们将代码添加到该文本文件中,它就不会删除该初始新行defines a text file itself

答案 8 :(得分:0)

这个问题以及大多数现有的答案似乎是基于一个误解。

通常称为“换行符”的ASCII控制字符(U + 000A LINE FEED,C中的\n不会开始(Unix样式)文本的新行文件。它结束文本文件的当前行。如果文本文件的最后一个字符是U + 000A,则在U + 000A和文件系统的EOF标记之间(无论如何实现),没有 空行。相反,如果(非空的)文本文件的最后一个字符是 not U + 000A,则文件的最后一行尚未结束-称为“不完整”。

使用一些示例可能会更清楚:

此文件包含两行完整的文本。它不包含第三个空行。

$ printf 'first\nsecond\n' | xxd
00000000: 6669 7273 740a 7365 636f 6e64 0a         first.second.

文件包含第三个空行。

$ printf 'first\nsecond\n\n' | xxd
00000000: 6669 7273 740a 7365 636f 6e64 0a0a       first.second..

文件仅包含完整的一行,以及第二个不完整行。

$ printf 'first\nsecond' | xxd
00000000: 6669 7273 740a 7365 636f 6e64            first.second

有时候,您想要的是不完整的最后一行,例如,在PHP脚本的最后?>和EOF之间使用换行符,可能会导致多余的空白被发送到渲染的HTML中,这很糟糕。位置(我会链接到具体示例,但今天早上我找不到运气)。因此,优秀的文字编辑人员可以在用户界面中清楚地区分上述三种情况。

但是,较旧的文本处理工具通常会误处理不完整的最后一行。例如,wc的某些实现不会将不完整的最后一行算作一行,而vi的某些实现会默默地向文件尾添加一个换行符,无论您是否想要还是不想要。因此,仅在有特定原因需要时才使用不完整的最后一行。

(注意:据我所知,我刚才所说的一切也适用于DOS样式的文本文件,在该文本文件中,两个字节的控制序列U + 000D U + 000A用于结束一行,而不仅仅是U + 000A。)