Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 为什么文本文件应该以换行符结尾?_File_Unix_Text Files_Newline - Fatal编程技术网

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节

参考资料:。

它可能与:

  • 文本文件(每一行都应该以行尾结尾)
  • 二进制文件(没有真正的“行”,文件的长度必须保留)
例如,如果每一行都以行尾结束,这可以避免连接两个文本文件会使第一行的最后一行变成第二行的第一行

此外,编辑器可以在加载时检查文件是否以行尾结束,将其保存在其本地选项“eol”中,并在写入文件时使用该选项

几年前(2005年),许多编辑(ZDE、Eclipse、Scite等)确实“忘记”了最终的EOL,。
不仅如此,他们还错误地将最终下线解释为“开始一个新行”,并实际开始显示另一行,就好像它已经存在一样。
与在上面的一个编辑器中打开文本文件相比,使用“适当”的文本文件和行为良好的文本编辑器(如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
之类的命令变得有用要困难得多:如何使命令连接文件,以便

  • 它将每个文件的开头放在一个新行上,这是您95%的时间想要的;但是
  • 它允许合并两个文件的最后一行和第一行,如上例所示,在
    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