檔案結尾
檔案結尾(英語: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) (英語).