2012-06-28 11 views
6

Ich habe eine Frage, die dieser Frage auf stackoverflow std::cin.clear() fails to restore input stream in a good state etwas ähnlich ist, aber die dort angegebene Antwort funktioniert nicht für mich.Zurücksetzen des Zustands eines Datenstroms

Die Frage ist: Wie kann ich den Zustand eines Streams wieder auf "gut" zurücksetzen?

Hier ist mein Code, wie ich es versuche, aber der Zustand ist nie wieder gut eingestellt. Ich habe beide Zeilen getrennt ignoriert.

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

Antwort

11

Der Code hier

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

nicht wirklich die failbit klar, es ersetzt den aktuellen Zustand des Stroms mit failbit.

Um alle Bits zu löschen, rufen Sie einfach clear().


Die Beschreibung im Standard ein bisschen gewunden ist, angegeben als Ergebnis anderer Funktionen

void clear(iostate state = goodbit);

Nachbedingung: Wenn rdbuf()!=0 dann state == rdstate(); sonst rdstate()==(state | ios_base::badbit).

was bedeutet im Grunde, dass der nächste Aufruf von rdstate() den Wert zu clear() geben zurückzukehren. Außer wenn es andere Probleme gibt, in diesem Fall könnten Sie auch eine badbit bekommen.

Auch ist goodbit tatsächlich überhaupt kein Bit, aber hat den Wert Null, um alle anderen Bits zu löschen.

nur löschen die ein bestimmtes Bit, können Sie diesen Anruf

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

jedoch verwenden, wenn Sie klar eine Flagge und andere bleiben, können Sie immer noch nicht aus dem Stream lesen. Daher ist dieser Einsatz eher begrenzt.

+0

In meinem Buch heißt es: clear (flag) setzt den angegebenen Zustand auf gültig. Ich interpretierte dies als: Löscht das angegebene Fehlerbit. Das ist dann falsch? – physicalattraction

+0

Es ist nur 'clear()' um * alle * Flags zu löschen. Ein einzelnes Flag zu löschen ist etwas komplizierter (und nicht zu nützlich). Ich habe meiner Antwort einen neuen Teil hinzugefügt. –

Verwandte Themen