什么是文本文件?

时间:2018-08-11 07:20:01

标签: c file character-encoding text-files binaryfiles

通常区分文本文件和二进制文件。但是有正式定义吗?我基本上已经看到了两种不同类型的定义。

第一个陈述指出,仅通过查看其内容就无法知道文件是否为文本文件。您必须考虑文件的预期用途。

另一种定义的风格是,如果文件中的所有字节都属于某个值集,则它是一个文本文件。对于更高级的字符编码,可能需要对该定义进行一些调整。

请赐教。文本文件的定义是什么?它与二进制文件有何不同?

2 个答案:

答案 0 :(得分:4)

在某些系统上,尤其是基于Unix的系统,文本文件和二进制文件之间没有显着差异。在其他系统上,尤其是Windows之类的行尾不是换行符的系统,存在重要的区别。

C标准定义了§7.21.2 Streams中的区别:

  

¶1输入或输出,无论是去往或来自终端设备和磁带驱动器之类的物理设备,还是去往或来自结构化存储设备上支持的文件,都被映射到逻辑数据流,其属性比其各种输入更为统一。和输出。支持两种形式的映射,分别是文本流和二进制流。 266)

     

¶2文本流是由行组成的有序字符序列,每行由零个或多个字符加上一个终止换行符组成。最后一行是否需要终止换行符是实现定义的。可能必须在输入和输出上添加,更改或删除字符,以符合用于在主机环境中表示文本的不同约定。因此,流中的字符与外部表示中的字符之间不需要一一对应。仅在以下情况下,从文本流中读取的数据必须与之前写入该流中的数据进行比较:数据仅由打印字符以及控制字符的水平制表符和换行符组成;不能在换行符之前紧跟空格字符;最后一个字符是换行符。读入时是否出现在换行符前立即写出的空格字符是实现定义的。

     

¶3二进制流是可以透明记录内部数据的有序字符序列。在相同的实现下,从二进制流中读入的数据应与先前写入该流中的数据进行比较。但是,这样的流可以在流的末尾附加实现定义数量的空字符。

     

266)实现无需区分文本流和二进制流。在这种实现中,文本流中不需要换行符,也不必限制行长。

§7.21.3 Files中的

  

¶1流通过打开文件与外部文件(可能是物理设备)相关联,这可能涉及创建新文件。如果需要,创建一个现有文件会导致其以前的内容被丢弃。如果文件可以支持定位请求(例如磁盘文件,而不是终端文件),则与流相关联的文件位置指示符将定位在文件的开头(字符号为零),除非使用以下命令打开文件追加模式,在这种情况下,实现方式是由文件位置指示符最初位于文件的开头还是结尾来定义的。文件位置指示符通过后续的读取,写入和定位请求进行维护,以促进整个文件的有序进行。

     

¶2二进制文件不会被截断,除非在7.21.5.3中定义。文本流上的写入是否导致相关文件被截断超过该点,是实现定义的。

基本上,二进制流是逐字读取和写入的;没有内容的解释。 Unix上的所有文件都有效地视为二进制文件。文本文件对此有限制-行上没有尾随空格,除换行符和水平制表符外没有控制字符,最后一个字符必须是换行符。如果违反规则会发生什么情况取决于实施情况。

该标准中未引用的段落处理宽字符流和字节流,以及流的方向以及流何时定向等。

有一些关于在文本文件中查找的规则,这些规则不适用于二进制文件。

答案 1 :(得分:2)

POSIX (IEEE Std 1003.1-2017)对此进行了定义:

  

3.403文本文件

     

一个文件,其中包含组织为零个或更多行的字符。这些行不包含NUL字符,并且长度都不能超过{LINE_MAX}个字节,包括字符。尽管POSIX.1-2017不能区分文本文件和二进制文件(请参阅ISO C标准),但是许多实用程序在对文本文件进行操作时只能产生可预测或有意义的输出。具有此类限制的标准实用程序始终在其STDIN或INPUT FILES部分中指定“文本文件”。

切切注意the Line definition;

  

3.206行

     

一个零个或多个非字符加上一个终止的字符的序列。

...这意味着不以换行符结尾的非空文件不是正确的文本文件。

非POSIX平台可能有不同的定义,或者根本没有适当的定义。