spezieller cin-befehl für fehler-behandlung
-
Hi Leute,
Ich habe eine speziele frage zum cin.good()-befehl. Mit diesem befehl ist es z.B. möglich, zu überprüfen ob die Eingabe mit dem Dateitypen der Variablen übereinstimmt. Mein Problem ist jetzt nur, wenn ich diese abfrage zum beispiel mit einer do-while-schleife behandle und er bei einem eingabefehler wieder eine neue eingabe machen soll, dann lässt er keine Eingaben mehr zu weil er sich in der Schleife verfängt, als ob der Tastaturpuffer noch voll wäre.
Das Listing:int intVariable; do { cout << "bitte eine intVariable eingeben"; cin >> intVariable; } while(!cin.good())
ok, das wars eigentlich schon!
-
also mit der methode std::cin.ignore() kanns du zeichen die sich imm puffer aufhalten überspringen, du musst nur wissen wie viele.
muss du eigentlich nicht weil du muss nicht genau angeben wie viele zeichen ignoriert werden sollen, du kannst 1 milion eingeben (hast aber pech wenn 1 milion und 1 zeichen sich im puffer aufhalten)es gibt natürlich eine möglichkeit zu erfahren wie viele zeichen sich dort aufhalten
std::streambuf * cin_buf = std::cin.rdbuf(); cout << cin_buf->in_avail() << endl;
oder kurtz ausgedrückt
std::cin.ignore( std::cin.rdbuf()->in_avail() );ahja und std::cin.clear() nicht vergessen um das ios::fail flag zu löschen (ohne clear belibt der rückgabe wert von good false)
-
also der cin.clear()-befehl funktioniert ohne probleme aber der cin.ignore()-befehl bewirkt bei mir nichts, er verfängt sich immer noch in einer Endlosschleife, als ob der Puffer nicht leer ist. Vielleicht funktioniert das auch nicht so richtig, weil ich unter Linux programmiere und es unter Linux anderes funktioniert, das weiß ich nicht so genau.
Ich konnte das problem mit dem cin.clear()-befehl zwar umgehen aber immer noch nicht so ganz nutzen wie ich es eigentlich vorhatte.Aber trotzdem Danke erstmal, Dimah!!!
-
Hi Dimah,
Ich hab jetzt nach etwas mehr recherche eine andere Möglichkeit gefunden, wie man den 'Puffer löschen' kann, und zwar muss man anstelle deines Beispiels nur mit:
while(cin.get()!='\n') ;
einfach nur die Zeichen die noch drin sind auslesen, und damit hat sich die Sache.