2012-10-15 86 views
1

爲什麼當我把cin.clear()然後cin.ignore()該程序完美地工作,例如:我把chars和程序不會bug。爲什麼訂單很重要?

但是當我把cin.ignore()cin.clear(),程序不停止發送錯誤信號。

這是如何工作的?

不應該將輸入擦除並且fail flag未被設置?

#include <iostream> 

using namespace std; 

class time 
{ 
private: 
int hours; 


public: 
void getime() 
{ 
do 
    { 
    cout << "Enter hours: "; 
    cin >> hours; 
    if (hours < 0 || hours > 23 || cin.fail() ) 
    { 
     cin.clear(); 
     cin.ignore(10,'\n'); 
     cerr << "invalid time, minutes must be between 0 and 59 " << endl; 


    } 
    }while(hours<0 || hours>23); 
} 
    }; 

int main() 
{ 
    time asd; 
    asd.getime(); 
    return 0; 
} 
+0

考慮將問題改寫爲「爲什麼」cout <<「hello world」; return;'works以及爲什麼返回; cout <<「hello world」;'不是? – 2012-10-15 16:07:46

+0

ouch,即時新聞,請溫柔哈哈。 – korek

+0

@korek cin.clear()不會對緩衝區執行任何操作。它只是重置標誌。因此,它可能不會做你認爲它做的事情。 –

回答

5

cin.clear(); cin.ignore(10,'\n');清除流的錯誤標誌進行重新可讀性,然後嘗試跳過最多10個字符的行的末尾。

cin.ignore(10,'\n'); cin.clear();首先嚐試跳過最多10個字符到一行的末尾(如果流處於錯誤狀態,這將失敗並且什麼都不做),然後清除流的錯誤標誌以使其再次可讀。然後你繞着循環再次嘗試讀取導致它上次失敗的格式不正確的數據。

如果問題是「爲什麼我不能使用ignore丟棄處於錯誤狀態的流中的數據」,那麼,呃,你不能。流被設計爲使用的方式是,它們進入錯誤狀態,並在那裏無所事事,直到你知道如何修復它(並且他們說你忽略了錯誤)或者放棄並退出。

+0

謝謝!!,就是這樣! :d – korek

相關問題