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,跳出回圈!
C++中的while (cin>>n,n):
他的作用是:輸入一個數,這數不爲0時進入回圈,爲0時跳出回圈。
採納:「https://www.cnblogs.com/tgycoder/p/4958519.html」
輸入(cin)緩衝是行緩衝。當從鍵盤上輸入一串字元並按回車後,這些字元會首先被送到輸入緩衝區中儲存。每當按下回車鍵後,cin 就會檢測輸入緩衝區中是否有了可讀的數據,這種情況下cin對鍵盤上是否有作爲流結束標誌CTRL+Z或者CTRL+D,其檢查的方式有兩種:阻塞式以及非阻塞式。
阻塞式檢查方式指的是隻有在回車鍵按下之後纔對此前是否有 Ctrl+Z 組合鍵按下進行檢查,非阻塞式樣指的是按下 Ctrl+D 之後立即響應的方式。如果在按 Ctrl+D 之前已經從鍵盤輸入了字元,則 Ctrl+D的作用就相當於回車,即把這些字元送到輸入緩衝區供讀取使用,此時Ctrl+D不再起流結束符的作用。如果按 Ctrl+D 之前沒有任何鍵盤輸入,則 Ctrl+D 就是流結束的信號。
阻塞式的方式有一個特點:只有按下回車之後纔有可能檢測在此之前是否有Ctrl+Z按下。