【问题标题】:What is a text file?什么是文本文件?
【发布时间】:2018-08-11 07:20:01
【问题描述】:

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

第一个声明不可能仅通过查看文件的内容来知道文件是否为文本文件。您必须考虑文件的预期用途。

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

请赐教。文本文件的定义是什么?它和二进制文件有什么区别?

【问题讨论】:

  • 没有万能的定义。它为什么如此重要?预期目的一有时是合适的,而字节范围一有时是合适的。
  • 除了答案中列出的方面之外,另一个影响文件是否有用的文本文件的质量是行长。一个包含 500,000 个普通打印字符后跟一个换行符的文件可以说是一个文本文件,但大多数文本文件实用程序可能无法正确处理。
  • 我会说您列出的两个“定义”都是正确的。另一件事是,是的,第二个定义“可能需要一些调整”。该定义取决于您对“打印字符”的概念是什么(ASCII?ISO8859-1?UTF-8?),以及您认为可以接受的控制字符。 Jonathan Leffler 引用的 C 标准文本仅提到水平制表符和换行符,但大多数人可能不会介意偶尔的退格或换页或其他一些。 (我们可能会陷入关于 \r 是否允许在文本文件中的疯狂存在论。)
  • text-filesbinaryfiles 的 SO 标签文本是一个好的开始。另见维基百科Text file 和[二进制文件](en.wikipedia.org/wiki/Binary_file)。但是不,我不相信你会找到一个单一的官方定义。
  • 除了 Unix 与 Windows(与旧 Mac)在行尾的约定之外,保守定义文本文件的另一个驱动因素是从前有支持 record oriented files 的操作系统是文件系统的显式部分。文本文件的每一行都必须适合记录,可能还有其他各种限制。 Unix 是彻底改变文件系统的操作系统之一,它宣称所有文件都是简单的、顺序的字节流,没有其他操作系统强加的结构。

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


【解决方案1】:

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

C 标准定义了§7.21.2 Streams 中的差异:

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

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

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

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

§7.21.3 Files:

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

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

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

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

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

【讨论】:

    【解决方案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 平台可能有不同的定义,或者根本没有正确的定义。

    【讨论】:

    • 这为 Jonathan Leffler 的 C 特定答案提供了更广泛的背景,这可能本身更接近您的实际要求。
    • ...长度不能超过 {LINE_MAX} 个字节...”非常有趣!
    猜你喜欢
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    相关资源
    最近更新 更多