美国国家海洋和大气管理局 (NOAA)的地球静止运行环境卫星 (GOES)-R 产品用户指南 (PUG)包含以下对纯文本文件 (§4.3) 的冗长描述(重点是我的):
Unix 文本文件格式用于 1b 级和 2+ 级半静态源数据文件的一小部分。Unix 文本文件格式(减去文件结尾字符)嵌入 GRB 元数据包中,以存储 netCDF 文件规范的基于 XML 的 netCDF 标记语言 (NcML) 表示,其中包括产品元数据的值。
Unix 文本文件格式是电子文本的一系列行(即记录),其长度可能可变。对于 GOES-R 地面系统,电子文本、换行符和文件结尾字符符合美国信息交换标准代码 (ASCII)。每行的末尾是换行符。在文件末尾,有一个文件结束符。
这是对文件内容的准确描述吗?我认为文件结束是操作系统或库例程在无法从文件(或其他流)中读取更多数据时返回的条件。这个字节实际上包含在文件中吗?
直到但不包括最后一个粗体部分,是的。但我不知道有任何 Unixy 系统会使用文件结尾字符,它们都将文件的长度存储到一个字节,因此不需要这样的标记。
再说一次,似乎有些系统确实使用了文件结尾字符。至少维基百科声称:
将文件长度仅存储到一个块将需要某种自定义来对数据流中最后一行的末尾进行编码。任何处理二进制数据的程序当然也必须以某种方式处理更细粒度的文件大小。但是,对于二进制文件,可能更容易忽略尾随的“额外”字节。
我想我已经看到 Control-Z 在 MS-DOS 上用作 EOF 标记,但在那里也没有必要。
引用的文本似乎对当前系统中的文本文件有错误的认识。如果我们看一下 POSIX 标准所说的,没有提到文本文件的文件结束字符或标记,只是它们不包含 NUL 字节并且由行组成(以换行符结尾)。
另请参阅:文件中的最后一个字符是什么?
至于这部分...
就像其他人在评论中所说的那样,ASCII 中没有文件结尾字符,至少没有那个名称(*)。上面提到的Control-Z是26位,或者“替代”(SUB),“用来表示乱码或无效字符”。因此,仅基于该文本,很难知道 EOF 字符是什么,如果使用它。
(* 有“文本结束”(ETX,代码 3)、“传输结束”(EOT,代码 4)、“传输块结束”(ETB,23)、“媒体结束”(EOM,25)和也是“文件分隔符”(FS,28)。关闭,但不准确。)
确实如此。
read()
当到达文件末尾时,系统调用返回零字节(没有错误),而一些 stdio 函数 (getchar()
) 有一个返回特殊值,不出所料地称为EOF
。另请参阅:EOT 和 EOF 之间的区别
这看起来对于他们正在讨论的文件格式非常具体。作为一般规则文件不需要 EOF 字符。Non 是在没有程序明确编写的情况下添加的。
检查 ASCII 表我没有看到 EOF 字符。他们可能指的是 EOT 或 FS 角色,但这并不清楚。https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html
然而,在某些文件格式中,在文件末尾添加一个标记是很常见的。特别是用于通信的简单文件格式。这可以防止文件被无意截断。如果您知道文件必须以特定标记结尾,并且该标记仅出现在末尾,则. 您可以轻松判断您收到的是整个文件还是部分文件。当我读到它时,他们指的是这种类型的标记。
他们所指的“文件结尾”字符可能是作为文件中最后一个字符出现的单个换行符。UNIX 和类 UNIX 系统上的大多数传统文本文件都以这样的方式结束,以便您可以使用
cat
命令(或类似的东西)来显示文件内容并确保下一个命令提示符将在它自己的行上。如果没有看到最后的换行符,一些表现不佳的应用程序实际上无法正确解析文件。在这方面,它有点像 UTF-8 编码文本中的 Unicode 字节顺序标记,根本不需要它(实际上,根据大多数标准,它甚至不应该存在),但一些应用程序拒绝解释事物没有它的 UTF-8。
但是,从操作系统本身的角度来看,不存在这样的“角色”。文件系统存储文件的正确大小,当被要求读取文件时,操作系统总共返回那么多数据,所以即使有这样的概念也没有意义,更不用说为它设置一个字符了。
有些人混淆了这个概念的 EOT 控制代码 (^D),因为它在类 UNIX 系统上广泛用于表示交互式输入流的结束,但这只是源自原始用法的约定(表示结束通过某些通信链路进行传输)。请注意,这与 DOS 系统有很大不同,在 DOS 系统中,^Z 用于在交互式输入和实际文件中实际发出文件结束的信号。EOT 控制代码实际上并没有出现在应用程序看到的数据流中,它由终端解释,当它遇到 ^D 时向应用程序发出文件结束条件的信号。