檔案結尾

相對於第一個位元的超出電腦檔案長度中的偏移量

檔案結尾(英語:End of File,縮寫為EOF),是作業系統無法從數據源讀取更多數據的情形。資料源通常為檔案或串流。

C標準函式庫中,像getchar這樣的數據讀取函數返回一個與符號(巨集)EOF相等的值來指明文件結束的情況發生,EOF的真實值與不同的平台有關(但通常是-1,比如在glibc[1]),並且不等於任何有效的字符代碼。塊讀取函數返回讀取的字節數,如果它小於要求讀取的字節數,就會出現一個文件結束符。

EOF字符

編輯

終端的輸入通常是不會結束的,除非設備被斷開。如果想讓終端結束,那麼可以輸入EOF字符使之結束。文件通常以EOF字符結尾,因此可以通過輸入文件使終端的輸入結束。由於EOF字符是不可輸入的,通常通過輸入/dev/null以達到輸入EOF的效果。

UNIXAmigaDOS中,將擊鍵翻譯為EOF的過程是由終端的驅動程序完成的,因此應用程序無需將終端和其它輸入文件區分開來。Unix平台的驅動程序在行首傳送一個傳輸結束字符Control+D,ASCII編碼為為04)來指明文件結束。在AmigaDOS中,驅動程序傳送一個Control+\來指明文件結束(而Control+D被用作中斷字符)。要向輸入流中插入一個真正的Control+D字符,用戶需要把一個「引用」命令字符放在它的前面(通常是Control-V英語Synchronous idle,表示下一個字符不作為控制字符,而是按照字面量使用)。

在微軟的DOSWindows(以及CP/M和許多DEC操作系統)中,讀取數據時終端不會產生EOF。此時,應用程序知道數據源是一個終端(或者其它「字符設備」),並將一個已知的保留的字符或序列解釋為文件結束的指明;最普遍地說,它是ASCII碼中的替換字符英語Substitute characterControl+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標記。

參考

編輯