1. 程式人生 > >EOF的意義及用法(while(scanf("%d",&n) != EOF))

EOF的意義及用法(while(scanf("%d",&n) != EOF))

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的返回值由後面的引數決定

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,跳出迴圈! C++中的while (cin>>n,n):

他的作用是:輸入一個數,這數不為0時進入迴圈,為0時跳出迴圈。 輸入(cin)緩衝是行緩衝。當從鍵盤上輸入一串字元並按回車後,這些字元會首先被送到輸入緩衝區中儲存。每當按下回車鍵後,cin 就會檢測輸入緩衝區中是否有了可讀的資料,這種情況下cin對鍵盤上是否有作為流結束標誌CTRL+Z或者CTRL+D,其檢查的方式有兩種:阻塞式以及非阻塞式。

阻塞式檢查方式指的是隻有在回車鍵按下之後才對此前是否有 Ctrl+Z 組合鍵按下進行檢查,非阻塞式樣指的是按下 Ctrl+D 之後立即響應的方式。如果在按 Ctrl+D 之前已經從鍵盤輸入了字元,則 Ctrl+D的作用就相當於回車,即把這些字元送到輸入緩衝區供讀取使用,此時Ctrl+D不再起流結束符的作用。如果按 Ctrl+D 之前沒有任何鍵盤輸入,則 Ctrl+D 就是流結束的訊號。 阻塞式的方式有一個特點:只有按下回車之後才有可能檢測在此之前是否有Ctrl+Z按下。

參考:百度百科。