Was tun gegen fehlerhafte Benutzereingaben?(C++)

the_undertaker

Erfahrenes Mitglied
Hallo,

ich habe öfter mal Programme, wo Zahlen eingegeben sollen, z.B.
C++:
int x;
cin>>x;
Wenn man nun einen Buchstaben o.ä. oder eine zu große Zahl eingibt, dann entsteht da irgenwie so eine Art Endlosschleife (sieht zumindest so aus). Was kann man dagegen tun?
 
Hallo,

ob bei der Verarbeitung einer Eingabe ein Fehler aufgetreten ist, kannst du mit den Methoden good(), bad(), fail() und eof() überprüfen:

C++:
int x;
cin >> x;

if (cin.good()) {
    // Alles ok
} else {
    if (cin.bad()) {
        // E/A-Fehler
    }
    if (cin.fail()) {
        // Verarbeitungsfehler
    }
    if (cin.eof()) {
        // Ende des Streams erreicht
    }
}

Grüße,
Matthias
 
Hi.
Hallo,

ich habe öfter mal Programme, wo Zahlen eingegeben sollen, z.B.
C++:
int x;
cin>>x;
Wenn man nun einen Buchstaben o.ä. oder eine zu große Zahl eingibt, dann entsteht da irgenwie so eine Art Endlosschleife (sieht zumindest so aus). Was kann man dagegen tun?
Man sollte bei allen Ein-/Ausgaben natürlich erstmal prüfen ob es geklappt hat:
C++:
int x; 

if (cin >> x) {
  // ...
Ein Stream kann bestimmte Zustände haben:
  1. bad
  2. fail
  3. eof
  4. good

Wenn irgendeine Operation fehlschlägt, wird der Zustand des Streams auf "fail" gesetzt. Wenn intern im Stream ein Fehler aufgetreten ist, welcher den Stream im Grunde unbrauchbar macht wird "bad" gesetzt. Wenn das Ende der Datei erkannt wurde, wird logischerweise "eof" gesetzt. Wenn keiner dieser 3 Zustände gesetzt ist, ist der Stream im "good" Zustand. Wenn der Zustand des Streams "good" ist, heißt dass das die nächste Ein-/Ausgabeoperation klappen könnte.

Wenn die Eingabe nicht geklappt hat, befindet sich der Stream in einem Fehlerzustand - und von einem Stream dessen Zustand nicht "good" ist, kann man nichts mehr einlesen.

Je nachdem ob der Fehler fatal war, lohnt es sich den Streamzustand zurückzusetzen und die Eingabe nochmal zu probieren. Das ist der Fall wenn der Zustand des Streams nicht "bad" ist (in dem Fall ist nichts mehr zu retten, der Stream ist im Eimer) und wenn noch nicht EOF aufgetreten ist.
C++:
...
} else if (!cin.bad() && !cin.eof()) {
  // Formatfehler: in der Eingabe war offensichtlich kein int
  cin.clear(); // Streamzustand zurücksetzen.
  
  string temp;
  getline(cin, temp); // komplette Zeile einlesen und verwerfen
} else {
  cerr << "Eingabe-Fehler. " << endl;
  exit (1);
}
Das ist auch eine der wenigen Situation wo man von den bad(), fail(), eof() und good() Funktionen der Streams Gebrauch machen sollte.

Gruß
 
Ich habe noch eine frage:
was ist der unterschied zwischen einem "E/A-Fehler" und einem "Verarbeitungsfehler"?
Ein E/A Fehler ist ein Eingabe/Ausgabefehler - z.B. wenn die CD zu zerkratzt ist oder die Netzwerkverbindung verloren ist.

Ein Verarbeitungsfehler tritt genau dann auf wenn versucht wird z.B. von einem Stream einen Integerwert zu lesen, die Konvertierung aber fehlschlug weil ein ungültiges Zeichen im Streampuffer war.

Gruß
 

Neue Beiträge

Zurück