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

Pet*_*rta 204 language-agnostic coding-style eof

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

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

Ral*_*ach 163

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

  • @NickM几乎所有采用文本输入或读取文本文件的POSIX/Unix命令行工具都假定文件末尾有一行结尾(`\n`).几个文本编辑器,如Vim和几个编译器(特别是C++和Python)将发出警告.(在C++的情况下,标准明确要求这样做.) (7认同)
  • 谢谢你的回答!任何可能表现出这种行为的流行工具示例? (4认同)
  • 所以你说的是...这是一个货神 (2认同)

use*_*090 46

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

  • 但是,您什么时候连接文件,并且在连接期间无法选择在文件之间添加换行符? (5认同)
  • @Rudey 例如。当你执行“cat file1 file2 file3”时 (2认同)

rsp*_*rsp 34

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

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

  • 该文件可能会被截断,您甚至不会知道 (198认同)
  • 第一部分是正确的,第二部分不是. (6认同)
  • 没有什么可以阻止文件在中间的某个地方出现换行符,并且文件很容易就在那里被截断。 (3认同)
  • @Rudey 是的,但这是一个很好的免费启发式方法。随机截断不太可能导致末尾出现换行符。 (2认同)

zwo*_*wol 22

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

\n

通常称为“换行符”(U+000A 换行符,\\nC 语言)的ASCII 控制字符不会在(Unix 样式)文本文件中开始新行。它结束文本文件的当前行。如果文本文件的最后一个字符是 U+000A,则U+000A 和文件系统的 EOF 标记“之间”没有空行(但是这是实现的)相反,如果(非空)文本文件的最后一个字符不是U +000A,则文件的最后一行尚未结束\xe2\x80\x94,则称其为“不完整”。

\n

通过一些例子可能会更清楚:

\n

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

\n
$ printf 'first\\nsecond\\n' | xxd\n00000000: 6669 7273 740a 7365 636f 6e64 0a         first.second.\n
Run Code Online (Sandbox Code Playgroud)\n

文件包含第三个空行。

\n
$ printf 'first\\nsecond\\n\\n' | xxd\n00000000: 6669 7273 740a 7365 636f 6e64 0a0a       first.second..\n
Run Code Online (Sandbox Code Playgroud)\n

文件只包含一个完整的行,加上第二个不完整的行。

\n
$ printf 'first\\nsecond' | xxd\n00000000: 6669 7273 740a 7365 636f 6e64            first.second\n
Run Code Online (Sandbox Code Playgroud)\n

有时,不完整的最后一行就是您想要的\xe2\x80\x94,例如,在?>PHP 脚本的最后一行和 EOF 之间有一个换行符,可能会导致在错误的位置将额外的空格发送到渲染的 HTML 中(我会链接到具体的例子,但今天早上我没有运气找到一个)。因此,优秀的文本编辑器会在其 UI 中清楚地区分上述所有三种情况。

\n

然而,旧的文本处理工具经常错误地处理不完整的最后几行。例如, 的某些实现wc不会将不完整的最后一行算作一行,而 的某些实现vi会默默地向不以 1 结尾的文件添加换行符,无论您是否愿意。因此,只有当您有特定原因需要时,才应使用不完整的最后几行。

\n

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

\n


Mat*_*Bak 18

如果您按照与为什么Python允许列表中的尾随逗号相同的推理附加到文件,也可以为更清晰的差异进行参数化


t0m*_*13b 15

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

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

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

  • ^ D不是"EOF标记".按^ D导致shell关闭前台进程组正在读取的管道的写入侧,以便从该管道读取返回EOF.没有"EOF标记". (5认同)

小智 8

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


Vic*_*des 7

这是因为文本文件的定义。当您在任何 UNIX 环境中创建新的文本文件时,该文件的内容是换行符 \n”

如果没有这个,该文件就不会真正被识别为文本文件。现在,一旦我们向该文本文件添加代码,就不会删除定义文本文件本身的初始新行。


Dam*_*ver 5

一些语言根据输入行定义它们的输入文件,其中每个输入行是一系列以回车符结尾的字符。如果他们的语法是这样定义的,那么文件的最后一个有效行也必须以回车符结束。