2012-06-28 103 views
6

我有一個問題,它與此問題在stackoverflow std::cin.clear() fails to restore input stream in a good state上略有相似,但提供的答案對我無效。重置流的狀態

現在的問題是:如何重新設置流的狀態爲'好'?

這是我的代碼,我怎麼嘗試,但狀態從來沒有設置好再次。我用兩條線分開忽略。

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int result; 
    while (std::cin.good()) 
    { 
     std::cout << "Choose a number: "; 
     std::cin >> result; 

     // Check if input is valid 
     if (std::cin.bad()) 
     { 
      throw std::runtime_error("IO stream corrupted"); 
     } 
     else if (std::cin.fail()) 
     { 
      std::cerr << "Invalid input: input must be a number." << std::endl; 
      std::cin.clear(std::istream::failbit); 
      std::cin.ignore(); 
      std::cin.ignore(INT_MAX,'\n'); 
      continue; 
     } 
     else 
     { 
      std::cout << "You input the number: " << result << std::endl; 
     } 
    } 
    return 0; 
} 

回答

11

這裏

std::cin.clear(std::istream::failbit); 

實際上並沒有清除failbit的代碼,它取代流的當前狀態failbit

要清除所有的位,只需撥打clear()


在標準中的描述是有點繞口,表述爲的其它功能

void clear(iostate state = goodbit);

後置條件結果:然後如果rdbuf()!=0state == rdstate();否則rdstate()==(state | ios_base::badbit)

這基本上意味着下一次調用rdstate()將返回傳遞給clear()的值。除了有其他問題時,在這種情況下,您也可能會收到badbit

此外,goodbit實際上根本沒有一點,但具有清零所有其他位的值爲零。

要清除只是的一個特定的位,你可以使用這個調用

cin.clear(cin.rdstate() & ~ios::failbit); 

但是,如果你明確一個標誌等依然存在,仍然不能從流中讀取。所以這個用途是相當有限的。

+0

在我的書中說:clear(flag)將指定的條件狀態設置爲有效。我將其解釋爲:清除指定的錯誤位。這是不正確的呢? – physicalattraction

+0

這只是清除()清除*所有*標誌。清除單個標誌有點複雜(並且不太有用)。我在答覆中增加了新的部分。 –