Problem mit Eingabepuffer
-
Hallo!

Ich bin vor kurzem von Codeblocks auf Visual C++ 2010 umgestiegen.
Jetzt wollte ich ein älteres Programm von mir nochmal neu in Visual C++ schreiben, d.h. "schöner" und kürzer.Ein Programmteil, der so in Codeblocks funktioniert stellt in der MS Umgebung aber ein Problem dar.
t ist ein Integer.
// Schleife für die Zeitabfrage do { // Zeiteingabe cout << "Bitte die Zeitspanne in Sekunden eingeben: "; cin >> t; if( t < 0 ) { cout << "\nFehler: Die Zeit kann nicht negativ sein!\a" << endl; } else if( cin.fail() ) { cout << "\nFehler: Eingabe war keine Zahl!\a" << endl; cin.clear(); // Fehlerflags löschen cin.ignore( numeric_limits<streamsize>::max(), '\n' ); // die ungültigen Zeichen ignorieren } } while( t < 0 || cin.fail() );Funktioniert bei der Eingabe von negativen und positiven Zahlen wie geplant. Doch bei der Eingabe von Buchstaben wird eine Endlosschleife ausgelöst und es kann nichts mehr eingegeben werden.
In Codeblocks läuft es so ganz normal.
Was muss ich in Visual C++ anders machen bzw. mache ich falsch?
Danke im Vorraus für kompetente Antworten.

-
flush den input stream mittels
#include <windows.h> // fflush(stream)
fflush(stdin);
ist unter windows definiert!
-
Danke für die Antwort, bewirkt jedoch leider nichts. Nach wie vor das selbe Problem.
-
Ist ja auch Käse, da stdin nichts mit der Pufferung von std::istream zu tun hat. Unter Windows funktioniert:
cin.sync();
-
Leute, gebt ihm doch nicht so komische Windwos Tipps, wenn er doch schon so schön plattformunabhängigen Code hat. Der Fehler liegt ganz woanders: Mach das
elseweg! Das hat von der Programmlogik her dort nichts zu suchen und löst die Endlosschleife aus, weil die if-Bedingung nie abgefragt wird.
-
Vielen Dank Sepp!
Das else muss sich da irgendwie eingeschlichen haben.
Mit einem If klappt es jetzt wudnerbar so wie es sein soll.
-
SeppJ schrieb:
Leute, gebt ihm doch nicht so komische Windwos Tipps, wenn er doch schon so schön plattformunabhängigen Code hat. Der Fehler liegt ganz woanders: Mach das
elseweg! Das hat von der Programmlogik her dort nichts zu suchen und löst die Endlosschleife aus, weil die if-Bedingung nie abgefragt wird.Das bringt ihm auch nichts. So ist's besser:
do { // Zeiteingabe cout << "Bitte die Zeitspanne in Sekunden eingeben: "; cin >> t; if( cin.fail() ) { cout << "\nFehler: Eingabe war keine Zahl!\a" << endl; cin.clear(); // Fehlerflags löschen cin.ignore( 32000, '\n' ); // die ungültigen Zeichen ignorieren t = -1; } else if( t < 0 ) { cout << "\nFehler: Die Zeit kann nicht negativ sein!\a" << endl; } } while( t < 0 );Die Prüfung auf cin.fail in der while-Bedingung bringt nichts, da sie ja mit cin.clear zurückgesetzt wurde.
mfg Martin