cin中函數的作用

cin是istream類的對象,它是從標準輸入設備(鍵盤)獲取數據,程序中的變量通過流提取符">>"從流中提取數據。流提取符">>"從流中提取數據時跳過輸入流中的空格、tab鍵、換行符等空白字符。注意:只有在輸入完數據再按回車鍵後,該行數據才被送入鍵盤緩存區,形成輸入流,提取運算符">>"才能從中提取數據。需要注意保證從流中讀取數據能正常運行。
 
  例如:   int a,b;         cin>>a>>b;      若從鍵盤中輸入21 abc回車,變量a從輸入流中提取整數21,提取操作成功,此時cin流出於正常狀態。但在變量b準備提取一個整數時,遇到了字母a,顯然提取操作失敗了,此時,cin流被置爲出錯狀態。只有在正常狀態,才能從輸入流中提取數據。

字符輸入的流成員函數   除了可以用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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章