一些代码样式工具推荐这个,我记得看到一些unix命令行工具警告缺少空行。
有多余的空行是什么原因?
答案 0 :(得分:150)
如果文本文件中的最后一行数据没有以换行符或回车符/新行组合终止,则许多旧工具行为异常。他们忽略该行,因为它以^ Z(eof)结束。
答案 1 :(得分:36)
如果您尝试将两个文本文件连接在一起,如果第一个文本文件以换行符结尾,您会更高兴。
答案 2 :(得分:34)
除了在文本编辑器中移动到文件末尾时,它是一个更好的光标位置。
在文件末尾添加换行符可以简单地检查文件是否已被截断。
答案 3 :(得分:16)
答案 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。)