Fehlerbehandlung von cin



  • Aloha,

    ich will was mit cin von der Konsole einlesen. Wenn ich einen int erwarte, aber ein Buchstabe eingegeben wird, kann ich keine neue Eingabe mit cin anfordern ...

    #include <iostream>
    
    using namespace std;
    
    int main (void)
    {
    	int a = 0;
    
    	while(1)
    	{
    		cout << "gib was ein:\n";
    		if(!(cin >> a))
    			cerr << "Fehler" << endl;
    		if(a == 9)
    			break;
    		cout << "Eingabe war: " << a << endl;
    	}
    }
    

    Wenn ich zB 'a' eingebe, dann wird ständig die Schleife durchlaufen (mit der Ausgabe: Fehler), ohne eine neue Eingabe zu ermöglichen ...
    Auch ein cin.clear(); cin.ignore(); in Verbindung mit cerr ... helfen nicht.
    Ich möchte aber gerne, daß die Aufforderung, etwas einzugeben, ausgegeben wird, und dann eine neue Eingabe möglich ist.
    Was muß ich dafür tun?





  • So:

    #include <iostream>
    #include <limits>
    
    using namespace std;
    
    int main (void)
    {
        int a = 0;
    
        while(1)
        {
            cout << "gib was ein:\n";
            if(!(cin >> a))
            {
                cin.clear(); //Fehlerflags loeschen
                cin.ignore(numeric_limits<streamsize>::max(), '\n'); //alles Gelumpe im stream wegschmeissen
                cerr << "Fehler" << endl;
            }
            if(a == 9)
                break;
            cout << "Eingabe war: " << a << endl;
        }
    }
    


  • Vielen Dank!

    Aber warum funktioniert: cin.clear(); cin.ignore(); nicht? Das sollte doch auch ein einzelnes Zeichen aus dem Puffer werfen können? So funktioniert es zB. mit cin.ignore(1, '\n');, was ja lediglich den Vorgabewert für den Delimiter von EOF auf '\n' ändert?!


Anmelden zum Antworten