2011-02-10 40 views
2

爲了測試BOOL I/O,我試圖運行這套短節目:的std :: cin.clear()失敗,在一個良好的狀態,以恢復輸入流

#include <iostream> 

int main() 
{ 
while(true) 
{ 
    bool f; 
    if (std::cin >> f) 
    std::cout << f << '\n'; 
    else 
    { 
    std::cout << "i/o error\n"; 
    std::cin.clear(); 
    } 
} 
return 0; 
} 

這裏是輸出我得到:

g++ -Wall -ansi -pedantic -o boolio boolio.cpp 
./boolio 
0 
0 
1 
1 
2 
i/o error 
- 
i/o error 
t 
i/o error 
i/o error 
i/o error 
... (infinite loop) 

我想知道爲什麼當我輸入't'時,我會得到一個無限循環,以及如何防止它。

謝謝。

回答

3

添加此行結算CIN後:

std::cin.ignore(); 

這樣,流忽略無論是留在它的緩衝區。

+0

工作,謝謝。但我仍不明白爲什麼' - '或'2'不需要它,而't'則需要它。 – 2011-02-10 17:26:42

1

if (std::cin >> f)預計爲0或1.並將所有其他值視爲I/0錯誤。即使輸入' - '或2,std::cin.ignore()仍然需要。

如果您希望程序只需輸入值true或false,使用下面的語句代替(std::cin >> f)

(std::cin >> boolalpha >> f)

1

嘗試使用以下組合:

cin.ignore(INT_MAX, '\n'); // ignore all characters in the current line 

cin.clear(); // restore 'good' flag 

使用只有cin.ignore()將只放棄緩衝區中的一個字符。