我想这里的每个人都熟悉这句谚语,即所有文本文件都应该以换行符结尾。我已经知道这个“规则”很多年了,但我一直在想——为什么?
当前回答
为什么(文本)文件应该以换行符结尾?
正如许多人所表达的,因为:
许多程序运行不好,或者没有它就会失败。即使能很好地处理文件的程序缺少结尾“\n”,该工具的功能也可能无法满足用户的期望——在这种情况下,这一点可能不清楚。程序很少禁止最后的“\n”(我不知道有)。
然而,这引出了下一个问题:
代码应该如何处理没有换行符的文本文件?
最重要的是,不要编写假设文本文件以换行符结尾的代码。假设文件符合某种格式会导致数据损坏、黑客攻击和崩溃。例子://错误的代码while(fgets(buf,buf大小,instream)){//如果没有\n,buf[]被截断,会发生什么buf[strlen(buf)-1]=“\0”;//尝试删除尾部\n...}如果需要最后一个结尾“\n”,请提醒用户该结尾不存在以及所采取的操作。IOW,验证文件的格式。注意:这可能包括对最大行长度、字符编码等的限制。清楚地定义,文档,代码对缺少final“\n”的处理。尽可能不要生成缺少结尾“\n”的文件。
其他回答
为什么(文本)文件应该以换行符结尾?
正如许多人所表达的,因为:
许多程序运行不好,或者没有它就会失败。即使能很好地处理文件的程序缺少结尾“\n”,该工具的功能也可能无法满足用户的期望——在这种情况下,这一点可能不清楚。程序很少禁止最后的“\n”(我不知道有)。
然而,这引出了下一个问题:
代码应该如何处理没有换行符的文本文件?
最重要的是,不要编写假设文本文件以换行符结尾的代码。假设文件符合某种格式会导致数据损坏、黑客攻击和崩溃。例子://错误的代码while(fgets(buf,buf大小,instream)){//如果没有\n,buf[]被截断,会发生什么buf[strlen(buf)-1]=“\0”;//尝试删除尾部\n...}如果需要最后一个结尾“\n”,请提醒用户该结尾不存在以及所采取的操作。IOW,验证文件的格式。注意:这可能包括对最大行长度、字符编码等的限制。清楚地定义,文档,代码对缺少final“\n”的处理。尽可能不要生成缺少结尾“\n”的文件。
除了上述实际原因之外,如果Unix的创始人(Thompson、Ritchie等人)或他们的Multics前辈意识到使用行终结符而不是行分隔符是有理论原因的,我也不会感到惊讶:使用行终结器,您可以对所有可能的行文件进行编码。使用行分隔符,零行文件和包含单个空行的文件之间没有区别;它们都被编码为包含零字符的文件。
因此,原因如下:
因为POSIX就是这样定义它的。因为有些工具期望它或没有它的“错误行为”。例如,wc-l不会计算最后的“行”,如果它不以换行结尾。因为它简单方便。在Unix上,cat只起作用,而且没有任何复杂的问题。它只复制每个文件的字节,不需要任何解释。我不认为DOS等同于猫。使用副本a+b c将最终将文件a的最后一行与文件b的第一行合并。因为零行的文件(或流)可以与一个空行的文件区分开来。
我一直觉得,在解析一个没有结尾换行符的文件时,这条规则是很困难的。也就是说,您最终会编写代码,其中行的结尾由EOL字符或EOF定义。假设一行以EOL结尾比较简单。
然而,我相信这个规则是从需要换行符的C编译器派生出来的。正如“文件末尾没有换行符”编译器警告所指出的,#include不会添加换行符。
假设文件正在被处理,而文件仍由另一个进程生成。
可能与此有关?指示文件已准备好处理的标志。
这源于使用简单终端的早期。换行符用于触发传输数据的“刷新”。
今天,不再需要换行符。当然,如果没有换行符,许多应用程序仍然存在问题,但我认为这是这些应用程序中的一个错误。
然而,如果你有一个需要换行符的文本文件格式,那么你可以得到非常便宜的简单数据验证:如果文件以结尾没有换行符的行结尾,那么你就知道文件已损坏。每行只有一个额外的字节,您可以高精度地检测损坏的文件,几乎不需要CPU时间。
推荐文章
- 为什么Path。以Path.DirectorySeparatorChar开头的文件名合并不正确?
- 递归复制文件夹,不包括一些文件夹
- 如何使用文件的行作为命令的参数?
- Python列表目录,子目录和文件
- 我如何使用换行符'\n'在f字符串格式化输出?
- 运行ssh后立即执行命令
- 在工具提示中添加换行符
- 我如何知道我在S3桶中存储了多少对象?
- 如果文件不存在,创建文件
- 如何让命令行参数传递给unix/linux系统上正在运行的进程?
- 是否有可能在MATLAB中每个文件定义多个函数,并从该文件外部访问它们?
- 如何删除具有特定名称的文件夹
- 使用grep删除空行
- 如何使用批处理文件写入文本文件?
- Git复制文件保存历史