一些代码风格的工具推荐这个,我记得看到一些 unix 命令行工具警告缺少空行。
有一个额外的空行的原因是什么?
\n\n
) 还是新行 \n
?
cat
shell 上的文件,您就会知道原因。如果你的文件让我的 shell 提示出现在它应该出现的位置(在行首)之外的任何其他地方,我可能会讨厌你。 ;)
如果文本文件中的最后一行数据未以换行符或回车符/换行符组合终止,则许多较旧的工具会出现异常。他们忽略该行,因为它以 ^Z (eof) 终止。
如果您尝试将两个文本文件连接在一起,如果第一个文件以换行符结尾,您会更开心。
cat file1 file2 file3
除了当您在文本编辑器中移动到文件末尾时它是一个更好的光标位置之外。
在文件末尾有一个换行符可以简单地检查文件是否被截断。
如果您按照与 Why are trailing commas allowed in a list? 相同的推理附加到文件,也可以为更清晰的差异创建一个参数
以下是从链接资源中复制(并稍作修改)的:
改变:
s = [
'manny',
'jack',
]
至:
s = [
'manny',
'jack',
'roger',
]
差异仅涉及一行更改:
s = [
'manny',
'jack',
+ 'roger',
]
当省略尾随逗号时,这击败了更令人困惑的多行差异:
s = [
'manny',
- 'jack'
+ 'jack',
+ 'roger'
]
文件末尾的空行出现,以便从输入流中进行标准读取将知道何时终止读取,通常返回 EOF 表示您已到达末尾。大多数语言都可以处理 EOF 标记。出于这个原因,从过去开始,在 DOS 下,EOF 标记是 F6 键或 Ctrl-Z,对于 *nix 系统,它是 Ctrl-D。
大多数(如果不是全部)实际上会一直读取到 EOF 标记,以便运行时库的从输入读取的函数将知道何时停止进一步读取。当您为追加模式打开流时,它将擦除 EOF 标记并写入它,直到显式调用关闭,它将在该点插入 EOF 标记。
较旧的工具需要一个空行,然后是 EOF 标记。如今,工具可以处理空行并忽略它。
\r\n
而不是 \n
,DOS 调用使用 ASCIIZ 和 ASCII$ 的混合。更糟糕的是,后来在 Windows 上通常会在大多数文本文件的开头插入一个 Unicode 字节顺序标记 (BOM)。可爱的“独特性”。
这个问题以及大多数现有答案似乎都是基于一种误解。
通常称为“换行符”的 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 中(我会链接举个具体的例子,但今天早上我找不到任何运气)。因此,好的文本编辑器会在其 UI 中清楚地区分上述所有三种情况。
但是,较旧的文本处理工具通常会错误处理不完整的最后几行。例如,wc
的某些实现不会将不完整的最后一行计为一行,而 vi
的某些实现会在不以 1 结尾的文件中静默地添加换行符,无论您想要还是不是。因此,只有在有特定原因需要它们时才应该使用不完整的最后一行。
(注:据我所知,我刚才所说的一切也适用于 DOS 风格的文本文件,其中两个字节的控制序列 U+000D U+000A 用于结束一行,而不仅仅是 U+000A。 )
此外,当您修改文件并在文件末尾附加一些代码时 - diff(至少标准配置中的 git diff )将显示您更改了最后一行,而您实际完成的唯一一件事 - 添加了换行符。所以 cvs 报告变得不那么方便了。
一些语言根据输入行定义其输入文件,其中每个输入行是一系列以回车符结尾的字符。如果它们的语法是这样定义的,那么文件的最后一个有效行也必须由回车终止。
这是因为文本文件的定义。在任何 unix 环境中创建新文本文件时,该文件的内容是 new line character '\n'
没有这个,文件就不会真正被识别为文本文件。现在,一旦我们将代码添加到此文本文件中,它就不会删除 defines a text file itself 的初始新行。
不定期副业成功案例分享
\n
)。几个文本编辑器,如 Vim,和几个编译器(特别是 C++ 和 Python)会发出警告。 (在 C++ 的情况下,标准明确要求这样做。)\n\n
。