代码之家  ›  专栏  ›  技术社区  ›  klutt

什么是文本文件?

  •  1
  • klutt  · 技术社区  · 7 年前

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

    第一种说法是,不可能仅仅通过查看文件的内容就知道文件是文本文件还是文本文件。你必须考虑文件的预期目的。

    另一个定义更像是一种样式,即如果文件中的所有字节都属于某一组值,那么它就是一个文本文件。这个定义可能需要一些调整,以适应更高级的字符编码。

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

    2 回复  |  直到 7 年前
        1
  •  4
  •   Community Mohan Dere    5 年前

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

    C标准定义了 §7.21.2 Streams :

    1输入和输出,无论是到终端和磁带机等物理设备,还是从结构化存储设备支持的文件,都被映射到逻辑数据流中,其属性比其各种输入和输出更加统一。支持两种形式的映射:文本流和二进制流。 266)

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

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

    266) 实现不需要区分文本流和二进制流。在这种实现中,文本流中不需要新行字符,也不需要对行的长度进行任何限制。

    而且 §7.21.3 Files :

    1流通过打开文件与外部文件(可能是物理设备)相关联,这可能涉及创建新文件。如果需要,创建现有文件会导致丢弃其以前的内容。如果文件可以支持定位请求(例如磁盘文件,而不是终端),那么与流相关联的文件位置指示符将定位在文件的开头(字符号0),除非文件是以附加模式打开的,在这种情况下,文件位置指示器最初是定位在文件的开头还是结尾是由实现定义的。文件位置指示器由后续的读取、写入和定位请求维护,以促进文件的有序传输。

    2二进制文件不会被截断,7.21.5.3中定义的除外。对文本流的写入是否会导致相关文件被截断,超出该点由实现定义。

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

    标准中未加引号的段落涉及宽字符流和字节流,以及流的方向和流何时变为方向等。

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

        2
  •  2
  •   tripleee    7 年前

    POSIX (IEEE Std 1003.1-2017) 它的定义如下:

    3.403文本文件

    包含组织成零行或多行的字符的文件。这些行不包含NUL字符,并且长度不能超过{LINE_MAX}字节,包括<新线>性格虽然是POSIX。1-2017不区分文本文件和二进制文件(参见ISO C标准),许多实用程序在对文本文件进行操作时只会产生可预测或有意义的输出。具有此类限制的标准实用程序总是在其STDIN或INPUT files部分中指定“文本文件”。

    切身注意 the Line definition ;

    零或多个非零的序列<新线>字符加一个终止符<新线>性格

    ... 这意味着不以换行符结尾的非空文件不适合作为文本文件。

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