c/c++ 中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,因此常被用來判斷調用一個函數是否成功。
例如:
1 #include <stdio.h> 2 3 int main() 4 { 5 int n; 6 while(scanf("%d",&n) != EOF) 7 { 8 9 } 10 11 return 0; 12 }
上面的程序運行時,如果不加" != 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時跳出循環。
采納:"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按下。