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


232

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

空行多余的原因是什么?


7
如果文件未以换行符结尾,则某些工具将无法使用。这与结尾处有一个空行(这将是2个换行符)不同。
威廉·珀塞尔

2
您是指空行(\n\n)还是换行\n
西罗Santilli郝海东冠状病六四事件法轮功

13
cat文件放在外壳上,您会知道为什么。如果您的文件使我的shell提示符出现在应有的提示符之外(在行首),我可能会恨您。;)
ThiefMaster 2014年

2
遇到了这个老问题,根本无法相信每个答案都试图通过说现代编码人员应该在代码本身中添加没有价值的字符来证明其他工具和系统的失败和不足。谈论关在笼子里的5只猴子!:-D
Amos M. Carpenter

1
更好(更普遍的)答案重新一般来说::文本文件stackoverflow.com/questions/729692/...
鲁文Bartelink

Answers:


188

如果文本文件中的最后一行数据没有以换行符或回车符/换行符终止,则许多较旧的工具将无法正常工作。他们忽略该行,因为它以^ Z(eof)终止。


1
感谢你的回答!流行工具的任何示例都可能表现出这种行为?
Nick Merrill

8
@NickM几乎所有用于输入文本或读取文本文件的POSIX / Unix命令行工具都在文件末尾假设行尾(\n)。一些文本编辑器(例如Vim)和一些编译器(尤其是C ++和Python)将发出警告。(在C ++的情况下,标准明确规定了这一点。)
greyfade

5
所以,您要说的是...这是一个货运
狂热者

但是您可以在最后一行输入文字,问题提到了一个空行\n\n
jinawee

57

如果尝试将两个文本文件连接在一起,则第一个文本文件以换行符结尾时会更加快乐。


38

除了在文本编辑器中移至文件末尾时它具有更好的光标位置这一事实。

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


221
该文件可能会被截断,甚至您也不会知道
Simon Nickerson 2010年

26

如果您按照与为什么列表中允许尾随逗号相同的理由将其追加到文件,则也可以为更清晰的差异提供参数

从链接的资源中复制了以下内容(并进行了一些修整):

变更:

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

至:

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

仅涉及差异的单行更改:

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

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

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

仅链接的答案在SO上不被认为有价值。请在保持归属的同时在此处复制相关信息。
isherwood

17

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

大多数(如果不是全部)实际上将一直读取到EOF标记,以便运行时库从输入读取的功能将知道何时停止进一步读取。当您为附加模式打开流时,它将擦除EOF标记并将其写入,直到显式调用close,然后在该位置将EOF标记插入。

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


6
^ D不是“ EOF标记”。按下^ D导致外壳关闭前台进程组正在读取的管道的写侧,因此从该管道进行的读取将返回EOF。没有“ EOF标记”。
William Pursell '02

@William Pursell您错误地将* NIX和Windows混为一谈。旧版Windows / DOS绝对使用通常在大多数文件结尾处嵌入的EOF标记(26、0x1a)作为与古代CP / M兼容的保留对象(谁在1983年之后使用了CP / M?)其他“乐趣”:\r\n而不是\nDOS使用ASCIIZ和ASCII $的混合调用。更糟糕的是,稍后在Windows上通常会在大多数文本文件的开头插入Unicode字节顺序标记(BOM)。可爱的“独特性”。

9

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


5

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.