Ehm naja wenn er den Inhalt des Buffers von cin halt nicht in den gewünschten Typ "formen" kann, wird das failbit gesetzt (setstate(failbit) usw ...). Dann gibt es bei Streams den schönen operator! ... kann man in dem Fall klasse gebrauchen
(
std::ios::operator!)
|
C-/C++-Quelltext
|
1
|
if (!(std::cin >> x)) std::cerr << "Falsche Eingabe!" << std::endl;
|
... soo geht das natürlich nur, weil der Stream-Operator eine std::istream Referenz zurück gibt! (
std::istream::operator>>) Sonnst müsste man machen:
|
C-/C++-Quelltext
|
1
2
|
std::cin >> x;
if (!std::cin) std::cerr << "Falsche Eingabe!" << std::endl;
|
...
So jetzt ist ein Fehler aufgetreten ... damit ist unser Stream solange unbrauchbar, bis wir den wegschaffen. Dazu muss einmal per std::cin.clear() das failbit|badbit entfernt werden (
std::ios::clear) und per std::cin.ignore alles aus dem Buffer geschoben werden (
std::istream::ignore), was drin ist.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
double value;
do
{
std::cout << "Value: ";
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
} while (!(std::cin >> value));
|
... so fängst du falsche Eingaben ab und dein Stream ist danach immer noch in Ordnung