文件结尾
文件结尾(英语:End of File,缩写为EOF),是操作系统无法从数据源读取更多数据的情形。数据源通常为文件或流。
在C标准函数库中,像getchar这样的数据读取函数返回一个与符号(宏)EOF
相等的值来指明文件结束的情况发生,EOF
的真实值与不同的平台有关(但通常是-1,比如在glibc中[1]),并且不等于任何有效的字符代码。块读取函数返回读取的字节数,如果它小于要求读取的字节数,就会出现一个文件结束符。
EOF字符
编辑终端的输入通常是不会结束的,除非设备被断开。如果想让终端结束,那么可以输入EOF字符使之结束。文件通常以EOF字符结尾,因此可以通过输入文件使终端的输入结束。由于EOF字符是不可输入的,通常通过输入/dev/null以达到输入EOF的效果。
在UNIX和AmigaDOS中,将击键翻译为EOF的过程是由终端的驱动程序完成的,因此应用程序无需将终端和其它输入文件区分开来。Unix平台的驱动程序在行首传送一个传输结束字符(Control+D,ASCII编码为为04)来指明文件结束。在AmigaDOS中,驱动程序传送一个Control+\来指明文件结束(而Control+D被用作中断字符)。要向输入流中插入一个真正的Control+D字符,用户需要把一个“引用”命令字符放在它的前面(通常是Control-V,表示下一个字符不作为控制字符,而是按照字面量使用)。
在微软的DOS和Windows(以及CP/M和许多DEC操作系统)中,读取数据时终端不会产生EOF。此时,应用程序知道数据源是一个终端(或者其它“字符设备”),并将一个已知的保留的字符或序列解释为文件结束的指明;最普遍地说,它是ASCII码中的替换字符(Control+Z,代码26)。一些MS-DOS程序,包括部分微软MS-DOS的shell(COMMAND.COM)和操作系统功能程序(如EDLIN),将文本文档中的Control+Z视为有意义数据的结尾,并且/或者在写入文本文档时将Control-Z添加到文档末尾。这是由于两个原因:
- 向后兼容CP/M。CP/M的第1版与第2版的文件系统以128字节“块”的倍数记录文件长度,所以当有意义数据在一个“块”的中间结束时,习惯上用Control+Z字符来标记它,此后至块结尾的字节为未利用。而MS-DOS文件系统总会记录文件确切的字节长度,所以在MS-DOS中文件不再必需以Control+Z字符来标记结尾。
- 它使得应用程序在从终端和文本文档读取数据时得以使用相同的代码。
使用Control-D的来历
编辑在ANSI X3.27-1969磁带标准中,文件结束是由带标记(英语:tape mark)指明的,它由一个约3.5英寸的间隙和随后的一个字节组成,在九轨磁带中这个字节包含字符13(十六进制),而在七轨磁带中包含字符17(八进制)。[2]带结尾(英语:end-of-tape),通常缩写为EOT,是由两个带标记指明的。这是在像IBM 360这样的机器上使用的标准。指明快到磁带物理结尾的反射棒也被称为一个EOT标记。
参考
编辑- ^ EOF and Errors (The GNU C Library). (原始内容存档于2011-12-05) (英语).
- ^ Tape Transfer (Pre-1977): Exchange Media: MARC 21 Specifications for Record Structure, Character Sets, and Exchange Media (Library of Congress). (原始内容存档于2020-02-23) (英语).