If-Anweisung
-
do { // Wird erst ab einem möglichen 2. Durchlauf wichtig cin.clear(); // Löscht den Fehlerstatus von cin cin.ignore(cin.rdbuf()->in_avail()); // Ignoriert bisher eingegebene Zeichen cout << "Zahl eingeben: " << flush; cin >> zahl; // Einlesen } while(!cin); // Schleife läuft nur bei Fehler beim Einlesen weiterWenn ein Fehler passiert wird bei cin ein Fehlerstatus gesetzt. Bevor wieder eingelesen werden kann muss dieser gelöscht werden (deswegen vor dem Einlesen cin.clear).
Desweiteren müssen wir alle im Puffer (cin.rdbuf) noch vorhandenen Zeichen (->in_avail) ignorieren (cin.ignore) sonst versucht er beim nächsten Mal wieder das selbe Zeichen in zB den int zu bekommen und der Fehler würde abermals auftreten.
MfG SideWinder
-
sync() oder ignore() richtig?
Humeee?

MfG SideWinder
-
SideWinder schrieb:
sync() oder ignore() richtig?
sync steht jedenfalls im Struppi drin
-
Wieso funktioniert das eigentlich mit
cin.ignore(cin.rdbuf()->in_avail());im Dev C++ nicht. Jedenfalls bei mir...
Der ignoriert halt nichts.Wenn ich jedoch nur ignorere() oder sync() aufrufe kalppt es.
Im BCB funktioniert beider

-
SideWinder schrieb:
sync() oder ignore() richtig?
Humeee?

Weder noch. Keines von beiden garantiert das Verhalten, was hier gewollt ist.
in_avail kann auch immer 0 liefern (wie z.B. bei der gcc Implementation) und das Verhalten von sync ist nur für Ausgabeströme spezifiziert.sync steht jedenfalls im Struppi drin
Leider ist das aber keine authoritative Quelle. Der Standard garantiert das Verhalten, was Stroustrup in seinem Buch beschreibt nicht.
Portabel ist wahrscheinlich nur:
while (cin.get() != '\n');mit all seinen Nachteilen.
-
a) Wer garantiert mir das die Eingabe ganz sicher mit '\n' abgeschlossen wurde?
b) Sieht der Standard das Leeren des Input-Streams in keiner Weise vor?MfG SideWinder
-
HumeSikkins schrieb:
SideWinder schrieb:
sync() oder ignore() richtig?
Humeee?

[...]und das Verhalten von sync ist nur für Ausgabeströme spezifiziert.
Wäre auch zu schön gewesen... Aber wie meinst du das genau?
Gruß Caipi
-
SideWinder schrieb:
a) Wer garantiert mir das die Eingabe ganz sicher mit '\n' abgeschlossen wurde?
Niemand. Genau so wie dir niemand garantiert, dass überhaupt Zeichen im Puffer stehen. D.h. die Schleife kann potentiell blockieren (bis jemand Enter drückt).
Deshalb schrieb ich ja "mit all seinen Nachteilen".b) Sieht der Standard das Leeren des Input-Streams in keiner Weise vor?
Doch schon, aber halt nur auf C++ Ebene.
Der Standard kennt aber weder eine Tastatur noch einen Tastaturpuffer und das ist das Problem. Wenn die Implementation z.B. einfach einen vorhandenen Tastaturpuffer benutzt, statt den Stream auf C++ Ebene zu puffern, dann gibt
es aus Sicht von Standard-C++ eben keine Möglichkeit den Puffer zu leeren, da nichts zwischen der aktuellen Leseposition und dem Ende des Lesepuffers steht.
-
Caipi schrieb:
HumeSikkins schrieb:
SideWinder schrieb:
sync() oder ignore() richtig?
Humeee?

[...]und das Verhalten von sync ist nur für Ausgabeströme spezifiziert.
Wäre auch zu schön gewesen... Aber wie meinst du das genau?
std::istream::sync ruft std::streambuf::pubsync auf, was wiederum std::streambuf::sync aufruft. Für diese Funktion wird aber nur für die "Put-Area" ein interessantes Verhalten spezifiziert. Ansonsten ist das Default-Verhalten einfach die Rückgabe von 0.
-
Danke, hat mir gut weitergeholfen!
Gruß
Bjoern
-
HumeSikkins schrieb:
Caipi schrieb:
HumeSikkins schrieb:
SideWinder schrieb:
sync() oder ignore() richtig?
Humeee?

[...]und das Verhalten von sync ist nur für Ausgabeströme spezifiziert.
Wäre auch zu schön gewesen... Aber wie meinst du das genau?
std::istream::sync ruft std::streambuf::pubsync auf, was wiederum std::streambuf::sync aufruft. Für diese Funktion wird aber nur für die "Put-Area" ein interessantes Verhalten spezifiziert. Ansonsten ist das Default-Verhalten einfach die Rückgabe von 0.
Danke. (Ist zwar ein bischen verspätet, aber trotzdem :)).
Gruß Caipi