我想这里的每个人都熟悉这句谚语,即所有文本文件都应该以换行符结尾。我已经知道这个“规则”很多年了,但我一直在想——为什么?
当前回答
每一行都应该以换行符结尾,包括最后一行。有些程序在处理文件的最后一行时遇到问题,如果它不是换行符。
GCC对此发出警告,并不是因为它无法处理文件,而是因为它必须作为标准的一部分。
C语言标准说非空的源文件应以换行符结尾,换行符前不得紧跟反斜杠字符。由于这是一个“应”条款,我们必须发出一条违反此规则的诊断信息。这在ANSI C 1989标准第2.1.1.2节中。ISO C 1999标准(可能还有ISO C 1990标准)第5.1.1.2节。
参考:GCC/GNU邮件存档。
其他回答
一个单独的用例:当文本文件受版本控制时,提交卫生。
如果将内容添加到文件末尾,则先前是最后一行的行将被编辑为包含换行符。这意味着,打开文件以了解该行最后一次编辑的时间将显示换行符添加,而不是您实际希望看到的提交。
(该示例特定于git,但同样的方法也适用于其他版本控制系统。)
这源于使用简单终端的早期。换行符用于触发传输数据的“刷新”。
今天,不再需要换行符。当然,如果没有换行符,许多应用程序仍然存在问题,但我认为这是这些应用程序中的一个错误。
然而,如果你有一个需要换行符的文本文件格式,那么你可以得到非常便宜的简单数据验证:如果文件以结尾没有换行符的行结尾,那么你就知道文件已损坏。每行只有一个额外的字节,您可以高精度地检测损坏的文件,几乎不需要CPU时间。
每一行都应该以换行符结尾,包括最后一行。有些程序在处理文件的最后一行时遇到问题,如果它不是换行符。
GCC对此发出警告,并不是因为它无法处理文件,而是因为它必须作为标准的一部分。
C语言标准说非空的源文件应以换行符结尾,换行符前不得紧跟反斜杠字符。由于这是一个“应”条款,我们必须发出一条违反此规则的诊断信息。这在ANSI C 1989标准第2.1.1.2节中。ISO C 1999标准(可能还有ISO C 1990标准)第5.1.1.2节。
参考:GCC/GNU邮件存档。
有些工具会这样做。例如,wc期望如下:
$ echo -n "Line not ending in a new line" | wc -l
0
$ echo "Line ending with a new line" | wc -l
1
为什么(文本)文件应该以换行符结尾?
正如许多人所表达的,因为:
许多程序运行不好,或者没有它就会失败。即使能很好地处理文件的程序缺少结尾“\n”,该工具的功能也可能无法满足用户的期望——在这种情况下,这一点可能不清楚。程序很少禁止最后的“\n”(我不知道有)。
然而,这引出了下一个问题:
代码应该如何处理没有换行符的文本文件?
最重要的是,不要编写假设文本文件以换行符结尾的代码。假设文件符合某种格式会导致数据损坏、黑客攻击和崩溃。例子://错误的代码while(fgets(buf,buf大小,instream)){//如果没有\n,buf[]被截断,会发生什么buf[strlen(buf)-1]=“\0”;//尝试删除尾部\n...}如果需要最后一个结尾“\n”,请提醒用户该结尾不存在以及所采取的操作。IOW,验证文件的格式。注意:这可能包括对最大行长度、字符编码等的限制。清楚地定义,文档,代码对缺少final“\n”的处理。尽可能不要生成缺少结尾“\n”的文件。
推荐文章
- 如何在Python中获得所有直接子目录
- 即使模板文件存在,Flask也会引发TemplateNotFound错误
- 如何在Ruby中创建文件
- 如何从命令行通过mysql运行一个查询?
- 在创建守护进程时执行双fork的原因是什么?
- __FILE__宏显示完整路径
- 对以制表符分隔的文件进行排序
- 如何使用查找命令从列表中查找所有具有扩展名的文件?
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- 如何删除文件中的特定行?
- 在Bash中获取日期(比当前时间早一天)
- Linux: kill后台任务
- 使用Java重命名文件
- 在OSX中永久设置PATH环境变量
- 如何从Python包内读取(静态)文件?