文件实际上包含文件结束 (EOF) 字符吗?

文件实际上包含文件结束 (EOF) 字符吗?

对地静止运行环境卫星 (GOES)-R 产品用户指南 (PUG)来自国家海洋和大气管理局 (NOAA) 的文档包含以下对纯文本文件的相当冗长的描述 (§4.3)(强调我的):

Unix 文本文件格式用于 1b 级和 2+ 级半静态源数据文件的一小部分。 Unix 文本文件格式(减去文件结束字符)嵌入到 GRB 元数据包中,以存储 netCDF 文件规范的基于 XML 的 netCDF 标记语言 (NcML) 表示形式,其中包括产品元数据的值。

Unix 文本文件格式是电子文本的行(即记录)序列,长度可能可变。对于 GOES-R 地面系统,电子文本、换行符和文件结束字符符合美国信息交换标准代码 (ASCII)。每行的末尾是换行符。在文件末尾,有一个文件结束符

这是对文件内容的准确描述吗?我认为文件结尾是当无法从文件(或其他流)读取更多数据时操作系统或库例程返回的条件。该字节实际上包含在文件中吗?

答案1

Unix 文本文件格式是电子文本的行(即记录)序列,长度可能可变。每行的末尾是换行符。在文件末尾,有一个文件结束字符。

这是对文件内容的准确描述吗?

直到但不包括最后一个粗体部分,是的。但我不知道有哪个 Unixy 系统会使用文件结束字符,它们都将文件的长度存储到一个字节,因此不需要这样的标记。

不过,似乎有些系统确实使用了文件结束字符。至少维基百科声称那:

CP/M 文件系统仅以 128 字节“记录”的倍数记录文件长度,因此按照惯例,如果有意义的数据在记录的中间结束,则使用 Control-Z 字符来标记有意义的数据的结尾。

如果文件长度仅存储到一个块,则需要某种自定义来对数据流中最后一行的末尾进行编码。当然,任何处理二进制数据的程序也必须以某种方式处理更细粒度的文件大小。不过,对于二进制文件,忽略尾随的“额外”字节可能更容易。

我想我已经看到 Control-Z 在 MS-DOS 上用作 EOF 标记,但在那里也没有必要。

引用的文本似乎对当前系统中的文本文件有一个错误的想法。如果我们看一下POSIX 标准的规定是什么,没有提到文本文件的文件结束字符或标记,只是它们不包含 NUL 字节并且由行组成(以换行符结尾)。

也可以看看:文件中的最后一个字符是什么?

至于这部分...

对于 GOES-R 地面系统,[...] 和文件结束字符符合美国信息交换标准代码 (ASCII)。

就像其他人在评论中所说的那样,ASCII 中没有文件结尾字符,至少没有该名称(*)。上面提到的Control-Z是26,或者说“替换”(SUB),“用来表示乱码或无效字符”。因此,仅根据该文本,很难知道 EOF 字符是什么(如果使用)。

(* 有“文本结束”(ETX,代码 3)、“传输结束”(EOT,代码 4)、“传输块结束”(ETB,23)、“介质结束”(EOM,25)和也是“文件分隔符”(FS,28)。

我认为文件结尾是当无法从文件(或其他流)读取更多数据时操作系统或库例程返回的条件。

确实如此。read()当到达文件末尾时,系统调用返回零字节(没有错误),而某些 stdio 函数 ( getchar()) 有一个返回特殊值,毫不奇怪地称为EOF.

也可以看看:EOT和EOF之间的区别

答案2

这看起来与他们正在讨论的文件格式非常特定。一般来说,文件不需要 EOF 字符。 Non 是在没有程序明确写入的情况下添加的。

检查 ASCII 表,我没有看到 EOF 字符。他们可能指的是 EOT 或 FS 角色,但这还不清楚。https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html

然而,在某些文件格式中,在文件末尾添加标记是很常见的。特别是用于通信的简单文件格式。这可以防止文件被无意中截断。如果您知道文件必须以特定标记结尾,并且该标记仅出现在末尾,则 .您可以轻松判断您是否收到了整个文件或仅收到了部分文件。当我读到它时,他们指的是这种类型的标记。

答案3

他们所指的“文件结束”字符可能是作为文件中最后一个字符出现的单个换行符。 UNIX 和类 UNIX 系统上的大多数传统文本文件都以这种方式结尾,以便您可以使用命令cat(或类似的命令)来显示文件内容,并确保下一个命令提示符将在其自己的行上。

一些表现不佳的应用程序如果没有看到最后的换行符,实际上无法正确解析文件。在这方面,它有点像 UTF-8 编码文本中的 Unicode 字节顺序标记,根本不需要它(实际上,根据大多数标准,它甚至不应该存在),但有些应用程序拒绝解释事物作为 UTF-8 没有它。


但从操作系统本身的角度来看,不存在这样的“角色”。文件系统存储文件的正确大小,当被要求读取文件时,操作系统总共返回那么多数据,因此即使有这样的概念也是没有意义的,更不用说有一个字符了。

有些人将 EOT 控制代码 (^D) 与这个概念混淆,因为它广泛用于类 UNIX 系统上,以表示交互输入流的结束,但这只是从原始用法(表示结束)衍生出来的约定。通过某些通信链路进行传输)。请注意,这与 DOS 系统显着不同,在 DOS 系统中,^Z 用于在交互式输入和实际文件中实际表示文件结束。 EOT 控制代码实际上并不显示在应用程序看到的数据流中,它由终端解释,当应用程序遇到 ^D 时,终端会向应用程序发出文件结束条件信号。

相关内容