Gibt es sowas wie ein flush für das cin Objekt?



  • Hallo erstmal, bin seit heute Mitglied (aber nicht im warsten Sinne des Wortes 😉 )

    Mir geht es um folgendes Problem:

    #include <iostream>
    using namespace std;
    
    int main()
    {
      int zahl;
      cout << "Bitte eine Zahl eingeben: ";
      cin >> zahl;
    }
    

    Wenn der user jetzt statt einer Zahl z.B. affe eingibt - weil zwingen kann ihn ja keiner 😡 - dann steht in zahl kein Ergebnis da affe nicht in den gewünschten Datentyp konvertiert werden kann. Dummerweise verbleiben die Fehleingaben aber im Eingabepuffer und eine erneute Aufforderung eine Zahl einzugeben schlägt fehl, da der "Müll" ja immernoch im Eingabepuffer steht.

    Ich habe als Lösung folgendes versucht:

    while(!(cin >> zahl)) //einlesen Bis Zahl eingegeben wurde
    {
      cerr << "Fehlerhafte Eingabe, bitte wiederholen!\n";
      while((zahl = cin.get()) != EOF);
    }
    

    Die Idee ist, das der Rest der Eingabe einfach per cin.get() Zeichenweise ausgelesen wird - bis EOF.
    Dann ist der Eingabepuffer wieder leer und es kann eine neue Eingabe erfolgen.
    Komischerweise liefert aber zahl = cin.get() sofort EOF! und es wird auf diese Weise der Puffer nicht geleert. Somit wird das ganze zur Endlosschleife. 👎

    Wie kann man nun den Eingabepuffer sauber löschen und damit neue Eingaben der Zahl möglich machen?

    PS: Komischerweise hat cout die Methode flush um den Ausgabepuffer zu leeren, wieso nicht cin?

    Habt schon mal dank für eure Mühen.
    Gruss René





  • Komischerweise liefert aber zahl = cin.get() sofort EOF! und es wird auf diese Weise der Puffer nicht geleert

    Nach der Fehleingabe ist das failbit des Streams gesetzt. Solange dieses bit gesetzt ist, kannst du nicht aus dem Stream lesen.

    Löschen tust du alle Statusbits durch den Aufruf von clear.

    cin.clear();
    

    Eine kleine Suche in diesem Forum hätte deine Frage übrigens längst beantwortet.
    Schau z.B. mal hier:
    http://www.c-plusplus.net/forum/viewtopic.php?t=43109



  • ... ist nur etwas ungewohnt. Trotzdem vielen Dank für die schnelle Hilfe.
    Funktioniert jetzt alles wunderbar. 🙂

    Gruss René


Anmelden zum Antworten