概述
從一個終端的輸入從來不會真的“結束”(除非設備被斷開),但把從終端輸入的數據分區成多個“檔案”卻很有用,因此一個關鍵的序列被保留下來來指明輸入結束。在
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添加到文檔末尾。這是由於兩個原因:
計算機術語
概念
在C語言中,或更精確地說成C標準函式館中表示檔案結束符(end of file)。在while循環中以EOF作為檔案結束標誌,這種以EOF作為檔案結束標誌的檔案,必須是文本檔案。在文本檔案中,數據都是以
字元的
ASCII代碼值的形式存放。我們知道,
ASCII代碼值的範圍是0~127,不可能出現-1,因此可以用EOF作為檔案結束標誌。
套用
檔案存取或其它 I/O 功能可能傳回等於象徵符號值 (巨集) EOF 指示檔案結束的情形發生。實際上 EOF 的值通常為 -1,但它依系統有所不同。巨集 EOF會在編譯原始碼前展開實際值給
預處理器。
C語言中,EOF常被作為檔案結束的標誌。還有很多檔案處理函式處錯誤後的返回值也是EOF,因此常被用來判斷調用一個函式是否成功。
例如:
#include <stdio.h>int main(void){int n,i;int array[25];while(scanf("%d",&n)!=EOF){for (i=0; i<n; i++)scanf("%d",&array[i]);for (i=0; i<n; i++)printf ("%d ",array[i]);}return 0;}
在 UNIX中, EOF表示能從互動式 shell (終端) 送出 Ctrl+D (習慣性標準)。在微軟的 DOS 與 Windows 中能送出 Ctrl+Z。在某些例子處理純文字檔案或從"字元設備"讀入資料,微軟
MS-DOS的 shell 或系統程式會加入
ASCIIControl-Z 字元到磁碟檔案結束處 (儘管基本核心
MSDOS.SYS檔案寫入呼叫從未附加 Control-Z)。這是向下相容於一些奇特的
CP/M功能,從CP/M 檔案系統只能就記錄的檔案長度分配多少 128 位元 "記錄"。MS-DOS 檔案系統從一開始就能精確的記錄檔案的位元長度。
ASCII
控制字元在字元串流是 out-of-band 不可列印字元。通常表可讀的
助憶碼。
在控制台要輸入eof的話 按ALT+65535就可以了。
與feof
C語言中,當把數據以二進制形式存放到檔案中時,就會有-1值的出現,此時不能採用EOF作為二進制檔案的結束標誌。為解決這個問題,
ANSI C提供一個
feof函式,用來判斷檔案是否結束。如果遇到檔案結束,函式feof(fp)的值為1,否則為0.feof函式既可用以判斷二進制檔案是否結束,也可以用以判斷文本檔案是否結束。
例如:編寫程式,用於把一個文本檔案(
源檔案)複製到另一個檔案(目的檔案)中。源檔案名稱為file_a.dat,目的檔案名稱為file_b.dat。程式如下:
#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>void filecopy(FILE *,FILE *);main ( ){FILE*fpin,*fpout;fpin =fopen ("file_a.dat","r"); /*打開輸入檔案*/fpout = fopen ("file_b.dat","w"); /*打開輸出檔案*/filecopy( fpin,fpout ); /*把fpin所指檔案中的內容輸出到fpout所指檔案中*/fclose ( fpin );fclose ( fpout ); /*關閉輸入輸出檔案*/}void filecopy( FILE *fpin, FILE *fpout ){char ch;ch = getc ( fpin ); /*先讀一次檔案再去判檔案是否結束*/while ( !feof( fpin ) ) /*當未到檔案末尾是進行循環*/{putc ( ch, fpout ); ch= getc ( fpin );} /*逐個字元進行複製*/}
EOF 函式
返回一個數值(整數類型
Integer),它包含布爾值
Boolean值
True,表明已經到達為
Random(Open語句方法)或順序
Input (Open 語句方法)打開的檔案的結尾。
語法
EOF(filenumber)
必要的filenumber參數是一個Integer,包含任何有效的檔案號。
說明
EOF (End Of File)
使用EOF是為了避免因試圖在檔案結尾處進行輸入而產生的錯誤。
直到到達檔案的結尾,EOF函式都返回False。對於為訪問Random或Binary而打開的檔案,直到最後一次執行的Get語句無法讀出完整的記錄時,EOF都返回False。