2012-06-28 12 views
6

Mam pytanie, które jest nieco podobne do tego pytania na stackoverflow std::cin.clear() fails to restore input stream in a good state, ale odpowiedź podana tam nie działa dla mnie.Resetowanie stanu strumienia

Pytanie brzmi: jak ponownie ustawić stan strumienia na "dobry"?

Oto mój kod, jak go wypróbować, ale stan nigdy nie jest ustawiony na dobry. Użyłem obu linii ignorować osobno.

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; 
} 

Odpowiedz

11

kod tutaj

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

faktycznie nie wyczyścić failbit, to zastępuje aktualny stan strumienia z failbit.

Aby wyczyścić wszystkie bity, wystarczy zadzwonić pod numer clear().


opis w standardowych jest trochę skomplikowane, stwierdzono w wyniku innych funkcji

void clear(iostate state = goodbit);

Postcondition: Jeśli rdbuf()!=0 następnie state == rdstate(); inaczej rdstate()==(state | ios_base::badbit).

Co zasadniczo oznacza, że ​​następne połączenie z rdstate() zwróci wartość przekazaną do clear(). Z wyjątkiem sytuacji, gdy występują inne problemy, w takim przypadku możesz uzyskać także badbit.

Również, goodbit w rzeczywistości wcale nie jest trochę, ale ma wartość zero, aby usunąć wszystkie pozostałe bity.

Aby wyczyścić tylko ten jeden konkretny kawałek, można użyć tego połączenia

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

Jeśli jednak jasne, jedna flaga, a inne pozostają nadal nie można odczytać ze strumienia. To użycie jest raczej ograniczone.

+0

W mojej książce jest napisane: clear (flaga) ustawia określony stan jako prawidłowy. Zinterpretowałem to jako: czyści podany bit błędu. To jest nieprawidłowe? – physicalattraction

+0

To jest po prostu 'wyczyść()' wyczyścić * wszystkie * flagi. Usunięcie pojedynczej flagi jest nieco bardziej skomplikowane (i niezbyt użyteczne). Dodałem nową część do mojej odpowiedzi. –