cin是istream類的對象,它是從標準輸入設備(鍵盤)獲取數據,程序中的變量通過流提取符">>"從流中提取數據。流提取符">>"從流中提取數據時跳過輸入流中的空格、tab鍵、換行符等空白字符。注意:只有在輸入完數據再按回車鍵後,該行數據才被送入鍵盤緩存區,形成輸入流,提取運算符">>"才能從中提取數據。需要注意保證從流中讀取數據能正常運行。
字符輸入的流成員函數 除了可以用cin輸入標準類型的數據外,還可以用istream類流對象的一些成員函數,實現字符的輸入。如cin.get(),cin.getline(字符數組(或字符指針),字符個數n,終止標誌字符)
eof函數 eof是end of file 的縮寫,表示“文件結束”。從輸入流讀取數據,如果到達文件末尾(遇到文件結束符),eof函數值爲非零值(表示真),否則爲0(表示假)。
peek函數 peek是觀察的意思,peek函數的作用是觀測下一個字符。 調用形式爲c=cin.peek();
putback函數 調用形式爲cin.putback(ch) 其作用是將前面用get或者getline函數從輸入流中讀取的字符ch返回到輸入流,插入到當前指針的位置,供後面讀取。
ignore函數 調用形式爲cin.ignore(n,終止字符) 函數作用是跳過輸入流中n個字符,或在遇到指定的終止字符時提前結束(此時跳過包括終止字符在內的若干字符)。
然後說一下的cin.clear()、cin.ignore()及cin.sync()的詳細用法及區別
一、cin.clear()、cin.sync()
cin.clear()是用來更改cin的狀態標示符的。
cin.sync()是用來清除緩存區的數據流的。 如果標示符沒有改變那麼即使清除了數據流也無法輸入。所以兩個要聯合起來使用。例如:
#include<iostream> using namespace std;
int main() { int a; cout<<"輸入一個字母:"<<endl; cin>>a; //int型變量中放了char型數據,failbit置1 cout<<"cin.fail()="<<cin.fail()<<endl; //輸出1
//cin.clear(); //cin.sync(); cout<<"輸入一個數字:"<<endl; //由於failbit值爲1,輸入流不能正常工作 cin>>a; //故此處的輸入無效 cout<<a<<endl; //輸出不確定值
cin.clear(); //此處用cin.clear()流標誌復位 //cin.sync(); cout<<"cin.fail()="<<cin.fail()<<endl; //此處failbit已爲0
cout<<"輸入一個數字:"<<endl; //但剛纔輸入的字符並沒有從流中清除,所以cin>>a又把那個字符放入a中,流輸入流又不能正常工作 cin>>a; cout<<a<<endl; //輸出不確定值 cout<<"cin.fail()="<<cin.fail()<<endl; //在此處failbit又爲1
cin.clear(); //再次修復輸入流 cin.ignore(); //取走剛纔流中的字符 cout<<"輸入一個數字:"<<endl; //再次接收用記輸入,這次輸入數字,正常輸出了 cin>>a; cout<<"a="<<a<<endl; //現在再看一下輸入流的failbit cout<<"cin.fail()="<<cin.fail()<<endl;//輸出0,表明輸入流已恢復正常 return 0; }
二、cin.ignore(a,ch)
從輸入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每拋棄一個字符,它都要計數和比較字符:如果計數值達到a或者被拋棄的字符是ch,則cin.ignore()函數執行終止;否則,它繼續等待。
它的一個常用功能就是用來清除以回車結束的輸入緩衝區的內容,消除上一次輸入對下一次輸入的影響。
比如可以這麼用:
cin.ignore(1024,'\n'),通常把第一個參數設置得足夠大,這樣實際上總是隻有第二個參數'\n'起作用,所以這一句就是把回車(包括回車)之前的所以字符從輸入緩衝(流)中清除出去。
三、cin.sync()和cin.ignor()的比較
sync()的作用就是清除輸入緩衝區。成功時返回0,失敗時badbit會置位,函數返回-1. 另外,對於綁定了輸出的輸入流,調用sync(),還會刷新輸出緩衝區。
但由於程序運行時並不總是知道外部輸入的進度,很難控制是不是全部清除輸入緩衝區的內容。通常我們有可能只是希望放棄輸入緩衝區中的一部分,而不是全部。比如清除掉當前行、或者清除掉行尾的換行符等等。但要是緩衝區中已經有了下一行的內容,這部分可能是我們想保留的。這個時候最好不要用sync()。可以考慮用ignore函數代替。 cin.ignore(numeric_limits<std::streamsize>::max(),'/n');//清除當前行 cin.ignore(numeric_limits<std::streamsize>::max()); //清除cin裏所有內容
不要被長長的名字嚇倒,numeric_limits<std::streamsize>::max()不過是climits頭文件定義的流使用的最大值,你也可以用一個足夠大的整數代替它。
使用ignore顯然能比sync()更精確控制緩衝區。(1)
也可以參照這個鏈接看看用法: http://blog.sina.com.cn/s/blog_5a735db00100b1z7.html 另外還有這個比較詳細些: http://apps.hi.baidu.com/share/detail/7211357