我想这里的每个人都熟悉这句谚语,即所有文本文件都应该以换行符结尾。我已经知道这个“规则”很多年了,但我一直在想——为什么?
当前回答
有些工具会这样做。例如,wc期望如下:
$ echo -n "Line not ending in a new line" | wc -l
0
$ echo "Line ending with a new line" | wc -l
1
其他回答
一个单独的用例:当文本文件受版本控制时,提交卫生。
如果将内容添加到文件末尾,则先前是最后一行的行将被编辑为包含换行符。这意味着,打开文件以了解该行最后一次编辑的时间将显示换行符添加,而不是您实际希望看到的提交。
(该示例特定于git,但同样的方法也适用于其他版本控制系统。)
很可能只是一些解析代码希望它在那里。
我不确定我是否会认为这是一条“规则”,而且这肯定不是我虔诚地遵守的。最明智的代码将知道如何逐行解析文本(包括编码)(任何行结尾的选择),最后一行是否有换行符。
的确,如果你以一条新的线结束:EOL和EOF之间(理论上)是否有一条空的最终线?一个值得思考的。。。
每一行都应该以换行符结尾,包括最后一行。有些程序在处理文件的最后一行时遇到问题,如果它不是换行符。
GCC对此发出警告,并不是因为它无法处理文件,而是因为它必须作为标准的一部分。
C语言标准说非空的源文件应以换行符结尾,换行符前不得紧跟反斜杠字符。由于这是一个“应”条款,我们必须发出一条违反此规则的诊断信息。这在ANSI C 1989标准第2.1.1.2节中。ISO C 1999标准(可能还有ISO C 1990标准)第5.1.1.2节。
参考:GCC/GNU邮件存档。
天啊,这是个人风格和观点的问题。
在过去,我没有写那句新语。保存的字符意味着14.4K调制解调器的速度更快。
稍后,我放置了换行符,以便使用shift+向下箭头更容易选择最后一行。
为什么文本文件应该以换行符结尾?
因为这是最明智的选择。
获取包含以下内容的文件:,
one\n
two\n
three
其中,\n表示换行符,在Windows上是返回字符,\r\n后跟换行符,因为它很酷,对吗?
这个文件有多少行?Windows说3,我们说3,POSIX(Linux)说文件是残缺的,因为文件末尾应该有一个。
无论如何,你会说它的最后一行是什么?我想任何人都同意三行是文件的最后一行,但POSIX表示这是一个残缺的行。
第二行是什么?哦,这里有第一个强烈的分离:
Windows说两个是因为文件是“用换行符分隔的行”(wth?);POSIX说2,并补充说这是一条真实、诚实的路线。
那么,选择Windows的后果是什么?简单:
你不能说文件是由行组成的
为什么?尝试从上一个文件中取出最后一行并复制几次。。。你得到了什么?这:
one\n
two\n
threethreethreethree
相反,尝试交换第二行和第三行。。。你会发现:
one\n
threetwo\n
因此
您必须说,文本文件是行和\n的交替,以行开始,以行结束
这真是一口,对吧?
你想要另一个奇怪的结果?
你必须接受一个空文件(0字节,实际上是0位)是一个单行文件,神奇的是,因为它们在微软很酷
这真是太疯狂了,你不觉得吗?
POSIX选择的后果是什么?
顶部的文件有点残缺,我们需要一些黑客来处理它。
是认真的
在前面的文本中,我是挑衅性的,因为处理缺少结尾的文本文件会迫使您使用特殊的滴答声/黑客来处理它们。你总是需要一个if/else来让事情运转起来,其中处理残缺行的分支只处理残缺行,所有其他行都采用另一个分支。这有点种族主义,不是吗?
我的结论
我赞成POSIX对行的定义,原因如下:
文件自然被认为是一系列行一行不应该是这样或那样的,这取决于它在文件中的位置空文件不是单行文件,拜托!您不应该被迫对代码进行黑客攻击
是的,Windows确实鼓励您省略后面的\r\n。如果需要下面的两行文件,则必须省略尾部,否则文本编辑器会将其显示为三行文件:
推荐文章
- 为什么Path。以Path.DirectorySeparatorChar开头的文件名合并不正确?
- 递归复制文件夹,不包括一些文件夹
- 如何使用文件的行作为命令的参数?
- Python列表目录,子目录和文件
- 我如何使用换行符'\n'在f字符串格式化输出?
- 运行ssh后立即执行命令
- 在工具提示中添加换行符
- 我如何知道我在S3桶中存储了多少对象?
- 如果文件不存在,创建文件
- 如何让命令行参数传递给unix/linux系统上正在运行的进程?
- 是否有可能在MATLAB中每个文件定义多个函数,并从该文件外部访问它们?
- 如何删除具有特定名称的文件夹
- 使用grep删除空行
- 如何使用批处理文件写入文本文件?
- Git复制文件保存历史