寫入若干個資料,再進行後續操作:
string str[100];
int pair_length = 0;
while (getline(cin, str[pair_length])
++pair_length;
do_something();
int a;
cin >> a;
do_sth_else();
想要讀入未知數個資料,可以使用while迴圈來實現,在輸入檔案結束符(eof,end-of-file)(windows 中為ctrl+z)時,會結束迴圈。
如上述例子,用cin讀入字串,則可以輸入任意多個字串,getline()即每次讀入一行,以換行符為分割,最後想要停止讀入字串則輸入ctrl+z即可。
本意是想讀入不定個數個字串並儲存,使用while迴圈實現,寫入完字串後鍵入檔案結束符eof結束迴圈進行後續處理,處理完後再根據輸入的值(例如乙個int)進行相關操作。
而實際上執行時,cin >> a;
並不能正常執行。
分析:
io操作,在錯誤輸入或輸入eof後流會進入錯誤狀態。
乙個流若進入錯誤狀態,則其後所有io操作都會失敗。
while迴圈中為了結束迴圈而鍵入eof後,strm::eofbit置位,表示流達到了檔案結束,cin進入錯誤狀態,所以無法寫入int a。
為了避免流處於錯誤狀態而程式出錯,在使用乙個流之前應該確認它是否處於良好狀態。
s.good()返回流的有效狀態,只有在流處於無錯狀態時(s.good()==true)才能讀取寫入資料。
更常見的一種方法是直接將流作為條件來使用。
io流的條件狀態可以檢測或設定的,io庫定義了iostate型別,這個位集合表示流的相關狀態。
s.eof() 可以檢測eofbit,若置位則返回true,eof時,eofbit和failbit都會被置位
s.fail() failbit或badbit置為都會返回true,表示當前狀態流不可用
s.bad() badbit置位返回true
s.good() 和fail相反,若true則表示流可用
回到上述例子中:
寫入完字串後鍵入檔案結束符eof後,cin.good()==false,後續cin不能用了,如果後面還想繼續讀入,可以呼叫cin.clear()。
無引數版的s.clear()會復位所有錯誤標誌位,此時cin.good()==true。
帶引數的s.clear(flags)可以復位指定的flags標誌位。
C 輸入 輸出流
低階i o功能 如無格式的i o 通常指大量的位元組在裝置到記憶體或記憶體到裝置的簡單傳輸。高階i o功能 格式化i o 它將位元組組合成有意義的單元,如資料型別。對於大容量檔案的處理,使用無格式的i o可獲得最佳的效能。不帶引數值成員函式get 從指定的流中讀取乙個字元 即使是空格 並返回該字元作...
C 輸入輸出流
一 c 流的概念 在c 語言中,資料的輸入和輸出 簡寫為i o 包括對標準輸入裝置鍵盤和標準輸 出裝置顯示器 對在外存磁碟上的檔案和對記憶體中指定的字串儲存空間 當然可 用該空間儲存任何資訊 進行輸入輸出這三個方面。對標準輸入裝置和標準輸出設 備的輸入輸出簡稱為標準i o,對在外存磁碟上檔案的輸入輸...
C 輸入 輸出流
一 流低階i o功能 如無格式的i o 通常指大量的位元組在裝置到記憶體或記憶體到裝置的簡單傳輸。高階i o功能 格式化i o 它將位元組組合成有意義的單元,如資料型別。對於大容量檔案的處理,使用無格式的i o可獲得最佳的效能。二 成員函式get和getline 不帶引數值成員函式get 從指定的流...