2012-10-28 97 views
4

可能重複:
Why is this cin reading jammed?清除CIN在C++

我重載istream的操作者(istream &operator>>...),它需要在格式的一個點:

(<x-coordinate>,<y-coordinate>) 

我想測試此多(10)倍,因此採寫:

for (int i = 0; i < 10; i++) { 
    cin >> a; 
    if (!cin.fail()) { cout << a << endl; } 
    else { cout << "Invalid input!" << endl; cin.clear(); } 
} 

編輯:

我現在有下面的代碼:

for (int i = 0; i < 10; i++) { 
    cin >> a; 
    if (!cin.fail()) { cout << a << endl; } 
    else { 
     cout << "Invalid input!" << endl; cin.clear(); 
     while (!cin.eof()) { cin.ignore(); } cin.ignore(); 
    } 
} 

忽略被邪神建議。但是,問題是cin仍然輸出「輸入無效!」通過上面的代碼運行後:

(3,3) <-- input 
(3,3) <-- output 
Invalid output! <-- second output 

有沒有辦法,我可以清除什麼是在cin?

+3

'cin.clear()'清除標誌,而不是內容。你想'忽略'。 – chris

+0

可悲的是,「卡住」是不是我會搜索和TL的一個術語;博士。 :) – Supervisor

+1

'tl; dr'不好回覆有用答案。 – nothrow

回答

2

cin.clear()不清空緩衝區,它的流重置錯誤標誌。 你就必須從輸入序列調用cin.ignore

istream& ignore (streamsize n = 1, int delim = EOF); 

提取字符,並丟棄它們。

提取當n字符已被提取並 丟棄或當字符DELIM被發現,以先到者爲準結束。 在後一種情況下,還會提取分隔符字符本身。


cin.clear(); 
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

Numeric Limits

+0

我換成cin.ignore cin.clear()(),並得到了相同的結果 – Supervisor

+1

你既需要也叫'cin.clear'用正確的參數被清除一些緩衝字符,。的分隔符,在該結算停止 –

+0

即使: cin.clear(); cin.ignore(的std :: numeric_limits <性病:: streamsize可> :: MAX(), '\ n'); 它。仍然有一個輸出「Invalidut!」 我只是用布爾值來跟蹤它是否進入else語句並手動跳過「\ n」。感謝您的幫助。 – Supervisor