一些代码风格工具推荐这样做,我记得看到一些unix命令行工具警告丢失空行。

有一个额外的空行是什么原因?


当前回答

这是因为文本文件的定义。当您在任何unix环境中创建一个新的文本文件时,该文件的内容是新的行字符'\n'

如果不这样做,文件就不能真正地将其标识为文本文件。现在,一旦我们将代码添加到这个文本文件中,它就不会删除这个定义文本文件本身的初始新行。

其他回答

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

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

如果您按照与为什么允许在列表中使用后面的逗号相同的推理添加到文件中,还可以为更清晰的差异做一个参数。

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

改变:

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

to:

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

只涉及diff中的一行更改:

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

这击败了后面省略逗号时更令人困惑的多行差异:

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

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

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

旧的工具期望一个空行,后面跟着EOF标记。现在,工具可以处理空行并忽略它。

这是因为文本文件的定义。当您在任何unix环境中创建一个新的文本文件时,该文件的内容是新的行字符'\n'

如果不这样做,文件就不能真正地将其标识为文本文件。现在,一旦我们将代码添加到这个文本文件中,它就不会删除这个定义文本文件本身的初始新行。