File 为什么文本文件应该以换行符结尾?
我想这里的每个人都熟悉这句格言,即所有文本文件都应该以换行符结尾。我知道这个“规则”已经很多年了,但我一直想知道-为什么?大概只是一些解析代码期望它出现 我不确定我会认为这是一个“规则”,这当然不是我信奉的东西。最明智的代码将知道如何逐行解析文本(包括编码)(任何行尾的选择),最后一行是否换行File 为什么文本文件应该以换行符结尾?,file,unix,text-files,newline,File,Unix,Text Files,Newline,我想这里的每个人都熟悉这句格言,即所有文本文件都应该以换行符结尾。我知道这个“规则”已经很多年了,但我一直想知道-为什么?大概只是一些解析代码期望它出现 我不确定我会认为这是一个“规则”,这当然不是我信奉的东西。最明智的代码将知道如何逐行解析文本(包括编码)(任何行尾的选择),最后一行是否换行 事实上,如果你以一个新行结束:在EOL和EOF之间(理论上)是否有一个空的最后一行?一个需要思考的问题是…基本上,如果没有得到最终的EOF,许多程序将无法正确处理文件 GCC警告您这一点,因为它是C标准的
事实上,如果你以一个新行结束:在EOL和EOF之间(理论上)是否有一个空的最后一行?一个需要思考的问题是…基本上,如果没有得到最终的EOF,许多程序将无法正确处理文件 GCC警告您这一点,因为它是C标准的一部分。(第5.1.1.2节)
我个人喜欢源代码文件末尾的新行
它可能起源于Linux或所有UNIX系统。我记得有一些编译错误(如果我没弄错的话,是gcc),因为源代码文件并没有以空的新行结尾。人们不禁要问,为什么要这样做。每一行都应该以换行符结尾,包括最后一行。如果文件的最后一行没有换行终止,某些程序在处理该行时会遇到问题 GCC对此发出警告,不是因为它无法处理该文件,而是因为它必须作为标准的一部分进行处理 C语言标准说 不为空的源文件应以新行字符结尾,其前面不得紧跟反斜杠字符 由于这是一个“应”条款,我们必须发出一条违反此规则的诊断消息 这在ANSI C 1989标准的第2.1.1.2节中。ISO C 1999标准(可能还有ISO C 1990标准)第5.1.1.2节 参考资料:。它可能与:
- 文本文件(每一行都应该以行尾结尾)
- 二进制文件(没有真正的“行”,文件的长度必须保留)
不仅如此,他们还错误地将最终下线解释为“开始一个新行”,并实际开始显示另一行,就好像它已经存在一样。
与在上面的一个编辑器中打开文本文件相比,使用“适当”的文本文件和行为良好的文本编辑器(如vim),这一点非常明显。它在文件的实际最后一行下方显示了一个额外的行。你会看到这样的情况:
1 first line
2 middle line
3 last line
4
假设文件正在处理中,而另一个进程仍在生成该文件
这可能与此有关?表示文件已准备好进行处理的标志。IMHO,这是个人风格和观点的问题 在过去,我没有写那条新线。保存一个字符意味着通过14.4K调制解调器的速度更快
后来,我添加了换行符,以便使用shift+向下箭头更容易地选择最后一行。这起源于使用简单终端的早期。换行符用于触发传输数据的“刷新” 如今,不再需要换行符了。当然,如果新行不在那里,很多应用程序仍然有问题,但我会认为这些应用程序中存在bug。 但是,如果您有一个文本文件格式,其中您需要换行符,那么您可以得到非常便宜的简单数据验证:如果文件结尾的行没有换行符,您就知道文件已损坏。每行只需增加一个字节,就可以高精度检测出损坏的文件,几乎不需要CPU时间。因为: 3.206行 零个或多个非字符加上一个终止字符的序列。 因此,不以换行符结尾的行不被视为实际行。这就是为什么有些程序在处理文件的最后一行时遇到问题,如果它不是换行终止的 在终端仿真器上工作时,此指南至少有一个硬优势:所有Unix工具都希望使用此约定并使用它。例如,当使用
cat
连接文件时,以换行符终止的文件将具有与不使用换行符的文件不同的效果:
$ more a.txt
foo
$ more b.txt
bar$ more c.txt
baz
$ cat {a,b,c}.txt
foo
barbaz
$more a.txt
福
$more b.txt
bar$more c.txt
巴兹
$cat{a,b,c}.txt
福
barbaz
并且,如前一个示例所示,当在命令行上显示文件时(例如,通过more
),以换行符结尾的文件会正确显示。不正确终止的文件可能被篡改(第二行)
为了保持一致性,遵循这条规则非常有帮助——否则,在处理默认Unix工具时将需要额外的工作
换一种方式思考:如果行不是以换行符结尾的,那么使诸如
cat
之类的命令变得有用要困难得多:如何使命令连接文件,以便
b.txt
和c.txt
之间cat
的使用更加复杂(通过添加位置命令行参数,例如cat a.txt--no newline b.txt c.txt
),现在,命令而不是每个单独的文件控制它的使用方式
$ echo -n "Line not ending in a new line" | wc -l
0
$ echo "Line ending with a new line" | wc -l
1
printf $'foo\nbar' | while read line
do
echo $line
done
while read line || [ -n "${line-}" ]
do
echo $line
done < <(printf $'foo\nbar')
curl http://cdnjs.cloudflare.com/ajax/libs/AniJS/0.5.0/anijs-min.js -o x.js
curl http://cdnjs.cloudflare.com/ajax/libs/AniJS/0.5.0/anijs-min.js -o y.js
$ cat x.js y.js > z.js
-rw-r--r-- 1 milanadamovsky 7905 Aug 14 23:17 x.js
-rw-r--r-- 1 milanadamovsky 7905 Aug 14 23:17 y.js
-rw-r--r-- 1 milanadamovsky 15810 Aug 14 23:18 z.js
// Bad code
while (fgets(buf, sizeof buf, instream)) {
// What happens if there is no \n, buf[] is truncated leading to who knows what
buf[strlen(buf) - 1] = '\0'; // attempt to rid trailing \n
...
}
[{
someProp: value
},
{
someProp: value
}] <-- No newline here
[{
someProp: value
},
{
someProp: value