當前位置:編程學習大全網 - 源碼下載 - 怎樣判斷文件結尾

怎樣判斷文件結尾

while(!cin.eof())並沒有錯吧,我的機器上能通過,只不過這個程序會無限循環。while(cin>>a>>b)這句和上面那句是壹樣的結果。while(cin>>n)表示的是判斷cin類中的三個狀態位,只要其中的三個狀態位之壹,被設置就反回true。

下面是C++中具體的關於cin的錯誤檢測機制,希望對妳有幫助

使用cin進行輸入:cin是類istream的對象。對於cin輸入,它將跳過空白(空格,換行符和制表符)直到遇到非空白字符,cin將讀取從非空白字符到與目標類型不匹配的第壹個字符之間的全部內容。比如有cin<<a;其中a是int,則輸入123 z x時,則只把123賦給變量a,而後面的z x則留在輸入流中,下壹次輸入時就將從這裏開始讀取,比如再有cin<<b;其中b是char型,則字符z將賦給變量b,這裏不會提示輸入變量b的值,這不是我們所預期的,而字符x又將留在輸入流中,在這裏不會讀取z前面的空白字符,正如前面所說cin輸入將跳過空白直到遇到非空白字符起才開始讀取。再比如cin<<a;其中a是int,則當輸入3 2 1時,則只有數字3被賦給變量a,因為在數字3後面的空格是與類型int不匹配的類型,在這裏就結束輸入。如果再輸入時輸入3.3這樣的數字的話,則同樣的道理,在程序中點符號對於整型來說是非匹配類型,所以只有數字3被輸入給變量a,則後面的字符被留在輸入流中。

C++中怎樣檢查輸入時的錯誤:在輸入時我們可能希望在用戶輸入錯誤的情況下給用戶發送壹個消息以便重新輸入,這種實現的機制就取決於C++的輸入錯誤檢查。

a、在C++中有三個位用來設置錯誤的狀態信息,iso::eofbit當文件到達末尾時則設置該位。ios::badbit當流被破壞時設置該位,這是不可恢復的,比如文件讀取錯誤。ios::failbit如果輸入操作未能讀取到預期的字符或輸出操作沒有寫入預期的字符則設置該位,這是可恢復的。這三個狀態標誌設置了不同類型的輸入錯誤。

b、可以使用流類繼承的函成員數來測試這三個對象的標誌,註意調用這些成員函數都要使用類的對象來調用,比如使用cin對象。

1、函數bad()如果badbit被設置,則反回true,

2、函數eof()如果eofbit被設置則反回true,

3、函數fail()如果badbit或failbit被設置則反回true。

4、函數good()如果沒有設置任何狀態位則反回true。壹旦設置了標誌,該標誌就會壹直保持下去,除非對它重新進行了設置。

5、函數clear()用於重設三個標誌位,不帶參數的clear()函數將清除三個狀態位即都設置為0。調用clear(eofbit);將使eofbit位設為1,而其他位設為0。而函數setstate(eofbit);同樣將eofbit位設為1,但不影響其他位,如果其他位被設置則依然被設置。

c、為什麽需要重設流狀態呢?因為壹旦流狀態的其中某壹位被設置後,則流將對後面的輸入或輸出關閉,直到流狀態被清除。比如cin>>a;其中a是int型變量,如果這時輸入壹個字符d,則會出現設置流狀態failbit位,這可以通過調用good()函數來測試,這時對後面的輸入將會關閉,也就是說如果cin>>a;後面還有壹句cin>>b;則語句cin>>b將不會執行。

d、如果希望程序在流狀態位被設置後能夠讀取後面的輸入,則必須將流狀態重置為良好。這可以使用clear()方法來實現。比如cin>>a; cin.clear(); cin>>b;其中變量a是整型。這時如果輸入壹個字符d語句cin>>a將使程序設置failbit位,語句cin.clear()將狀態位failbit位清除,接著執行語句cin>>b,這時會發現程序cin>>b;沒有提示輸入,這是為什麽呢?原因就在於雖然使用clear()函數重置了流狀態,但是不匹配的輸入仍然留在輸入隊列中,下壹次輸入就將從這裏讀起,而不會提示用戶輸入內容,而是從輸入流中直接提取,也就是說字符d會直接賦給變量b;如果變量b是字符型的話則接收他,並把字符d賦給b,這裏不會提示輸入變量b的值,這不是我們所預期的。如果變量b是整型變量的話,則cin>>b又將是錯誤的。怎樣能在第壹次輸入錯誤後讓系統提示用戶為以後的輸入語句輸入內容呢?方法就是使用壹個函數來壹直讀取輸入流中的字符直到達到空白為止,這可以使用isspace()函數和ignore()函數來實現,下面將具體介紹。

  • 上一篇:有沒有女主比較堅持,然後又勵誌的言情小說。
  • 下一篇:投資數據網和管理杏仁哪個好?
  • copyright 2024編程學習大全網