EOF,為End Of File的縮寫,通常在文本的最后存在此字符表示資料結束。
在微軟的DOS和Windows中,讀取數據時終端不會產生EOF。此時,應用程序知道數據源是一個終端(或者其它“字符設備”),並將一個已知的保留的字符或序列解釋為文件結束的指明;最普遍地說,它是ASCII碼中的替換字符(Control-Z,代碼26)。
在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(){ int n; while(scanf("%d",&n) != EOF){ } return 0; }
當上面的程序運行時,如果不加" != EOF",那么這個程序就是個死循環,會一直運行下去;加上" != EOF"后該程序就不是死循環了,如果在終端不進行輸入該程序會自動結束(while的意思就是說當當前輸入緩存還有東西時就一直讀取,直到輸入緩存中的內容為空時停止)。
在這"scanf("%d",&n) != EOF"相當於"scanf("%d",&n) != EOF",或"~scanf("%d",&n)",或"scanf("%d",&n) == 1 " 。scanf的返回值由后面的參數決定。
有小伙伴會問到上面那個程序怎么結束呢?
要注意的是:在終端(黑框)中手動輸入時,系統並不知道什么時候到達了所謂的“文件末尾”,因此需要用<Ctrl + z>組合鍵然后按 Enter 鍵的方式來告訴系統已經到了EOF,這樣系統才會結束while.
scanf("%d%d", &a, &b);
如果a和b都被成功讀入,那么scanf的返回值就是2;如果只有a被成功讀入,返回值為1;如果a和b都未被成功讀入,返回值為0;如果遇到錯誤或遇到end of file,返回值為EOF,且返回值為int型。
但是在C++中不存在這種用法,但相同作用的有while((cin >> a) != 0):
以前不理解在while里面用cin >> a;是什么意思,cin是C++的輸入流對象,">>"是重載的運算符,cin>>的返回值是cin對象。用這個當條件的話,通過檢測其流的狀態來判斷結束;
(1)若流是有效的,即流未遇到錯誤,那么檢測成功;
(2)若遇到文件結束符,或遇到一個無效的輸入時(例如本題輸入的值不是一個整數),istream對象的狀態會變為無效,條件就為假;讀取失敗的時候,就不能繼續讀取了,那么讀取操作結束,while(cin>>a)就返回false,跳出循環!
