本页使用了标题或全文手工转换

檔案結尾

维基百科,自由的百科全书
跳转至: 导航搜索

檔案結尾英语End of File,縮寫為EOF),是作業系統无法从数据源读取更多数据的情形。資料源通常为檔案或串流。

C標準函式庫中,像getchar这样的数据读取函数返回一个与符号(宏)EOF相等的值来指明文件结束的情况发生,EOF的真实值与不同的平台有关(但通常是-1,比如在glibc[1]),并且不等于任何有效的字符代码。块读取函数返回读取的字节数,如果它小于要求读取的字节数,就会出现一个文件结束符。

EOF字符[编辑]

从一个终端的输入从来不会真的“结束”(除非设备被断开),但把从终端输入的数据分割成多个“文件”却很有用,因此一个关键的序列被保留下来来指明输入结束。在UNIXAmigaDOS中,将击键翻译为EOF的过程是由终端的驱动程序完成的,因此应用程序无需将终端和其它输入文件区分开来。Unix平台的驱动程序在行首传送一个传输结束字符(Control-D,ASCII编码为为04)英语End-of-transmission character来指明文件结束。在AmigaDOS中,驱动程序传送一个Control-\来指明文件结束(而Control-D被用作中断字符)。要向输入流中插入一个真正的Control-D字符,用户需要把一个“引用”命令字符放在它的前面(通常是Control-V英语Synchronous idle,表示下一个字符不作为控制字符,而是按照字面量使用)。

在微软的DOSWindows(以及CP/M和许多DEC操作系统)中,读取数据时终端不会产生EOF。此时,应用程序知道数据源是一个终端(或者其它“字符设备”),并将一个已知的保留的字符或序列解释为文件结束的指明;最普遍地说,它是ASCII码中的替换字符(Control-Z,代码26)英语Substitute character。一些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标记。

参考[编辑]