为什么建议在源文件的末尾使用空行?

Why is it recommended to have empty line in the end of a source file?

提问人:Petteri H 提问时间:2/18/2010 最后编辑:Ruben BartelinkPetteri H 更新时间:11/12/2021 访问量:99395

问:

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

多加一行空行的原因是什么?

与语言无关 编码样式 EOF

评论

8赞 William Pursell 2/18/2010
如果文件不以换行符结尾,则某些工具无法正常工作。这与末尾有一个空行(即 2 个换行符)不同。
7赞 Ciro Santilli OurBigBook.com 9/14/2014
你的意思是空行()还是换行?\n\n\n
23赞 ThiefMaster 9/26/2014
catshell 上的文件,你就会知道为什么。如果您的文件使我的 shell 的提示出现在它应该出现的位置(在行的开头)以外的任何其他地方,我可能会讨厌你。;)
2赞 Ruben Bartelink 9/20/2019
更好(更一般)的答案是一般的文本文件:: stackoverflow.com/questions/729692/...
7赞 James Lin 3/30/2020
我的问题是,在这个时候,这个建议仍然适用吗?

答:

265赞 Ralph M. Rickenbach 2/18/2010 #1

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

评论

10赞 greyfade 11/26/2016
@NickM 几乎所有接受文本输入或读取文本文件的 POSIX/Unix 命令行工具都假定在文件末尾以行结尾 ()。一些文本编辑器,如Vim,和几个编译器(特别是C++和Python)将发出警告。(在C++的情况下,标准明确要求这样做。\n
25赞 Jaykul 6/15/2019
所以你说的是......这是一个货物崇拜
0赞 jinawee 10/22/2019
然而,你可以在最后一行有文字,问题提到了一个空行。\n\n
46赞 rsp 2/18/2010 #2

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

在文件末尾使用换行符可以简单地检查文件是否未被截断。

评论

278赞 Simon Nickerson 2/18/2010
文件可能会被截断,您甚至永远不会 kn
3赞 Rudey 6/29/2020
没有什么能阻止文件在中间的某个地方有换行符,而且文件可以很容易地在那里被截断。
5赞 Raimund Krämer 9/24/2020
@Rudey真的,但它是一个很好的免费启发式方法。随机截断不太可能导致末尾出现换行符。
21赞 t0mm13b 2/18/2010 #3

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

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

较旧的工具期望有一个空行,后跟 EOF 标记。如今,工具可以处理空行并忽略它。

评论

7赞 William Pursell 2/18/2010
^D 不是“EOF 标记”。按 ^D 会导致 shell 关闭前台进程组正在从中读取的管道的写入端,以便从该管道读取将返回 EOF。没有“EOF标记”。
0赞 10/18/2017
@William Pursell:你错误地把 *NIX 和 Windows 混为一谈。传统的 Windows/DOS 绝对使用通常嵌入在大多数文件末尾的 EOF 标记 (26, 0x1a) 作为与古代 CP/M 兼容的保留(谁在 1983 年之后使用了 CP/M?其他“乐趣”:代替 ,DOS 调用使用 ASCIIZ 和 ASCII$ 的混合。更糟糕的是,后来在 Windows 上通常会在大多数文本文件的开头插入 Unicode 字节顺序标记 (BOM)。可爱的“独特性”。\r\n\n
6赞 Damien_The_Unbeliever 2/18/2010 #4

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

10赞 prijutme4ty 5/14/2013 #5

此外,当您修改文件并在文件末尾附加一些代码时 - diff(至少在标准配置中是 git diff)将显示您更改了最后一行,而您实际执行的唯一操作 - 添加了换行符。因此,简历报告变得不那么方便了。

93赞 user1809090 4/22/2014 #6

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

评论

10赞 Rudey 6/29/2020
但是,您什么时候会连接文件,并且在连接过程中无法选择在两者之间添加换行符?
8赞 maoizm 3/20/2021
@Rudey例如。当你这样做时cat file1 file2 file3
0赞 Solstad 2/22/2023
@maoizm 您可以只让 file2 成为换行符,因此您确实可以选择(或者更确切地说)。此外,这不是“何时”,而是“如何”。cat file1 newlinefile file2 newlinefile file3
49赞 Mathias Bak 10/21/2015 #7

如果按照与为什么列表中允许尾随逗号相同的推理追加到文件,也可以为更干净的差异提出参数?

以下内容是从链接的资源中复制(并修剪了一点):

改变:

s = [
  'manny',
  'jack',
]

自:

s = [
  'manny',
  'jack',
  'roger',
]

仅涉及差异中的一行更改:

  s = [
    'manny',
    'jack',
+   'roger',
  ]

当省略尾随逗号时,这击败了更令人困惑的多行差异:

  s = [
    'manny',
-   'jack'
+   'jack',
+   'roger'
  ]
7赞 Victor Fernandes 10/11/2018 #8

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

否则,文件不会真正标识为文本文件。现在,一旦我们向这个文本文件添加代码,它就不要删除这个定义文本文件本身的初始换行符。

22赞 zwol 12/2/2020 #9

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

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

通过一些示例,这可能会更清楚:

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

$ 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中(我会链接到具体的例子,但我今天早上没有运气找到一个)。因此,优秀的文本编辑器会在他们的 UI 中清楚地区分上述三种情况。?>

但是,较旧的文本处理工具经常无法处理不完整的最后一行。例如,某些实现不会将不完整的最后一行计为一行,而某些实现将默默地将换行符添加到不以 1 结尾的文件中,无论您是否愿意。因此,只有当您有特定原因需要它们时,才应该使用不完整的最终行。wcvi

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