# Was tun gegen fehlerhafte Benutzereingaben?(C++)



## the_undertaker (21. Juni 2007)

Hallo,

ich habe öfter mal Programme, wo Zahlen eingegeben sollen, z.B.
	
	
	



```
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?


----------



## Matthias Reitinger (21. Juni 2007)

Hallo,

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


```
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


----------



## deepthroat (21. Juni 2007)

Hi.





the_undertaker hat gesagt.:


> Hallo,
> 
> ich habe öfter mal Programme, wo Zahlen eingegeben sollen, z.B.
> 
> ...


Man sollte bei allen Ein-/Ausgaben natürlich erstmal prüfen ob es geklappt hat:
	
	
	



```
int x; 

if (cin >> x) {
  // ...
```
Ein Stream kann bestimmte Zustände haben:

bad
fail
eof
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.

```
...
} 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ß


----------



## the_undertaker (22. Juni 2007)

Vielen Dank für die Antworten!


----------



## lordfritte (13. August 2007)

Ich habe noch eine frage:
was ist der unterschied zwischen einem "E/A-Fehler" und einem "Verarbeitungsfehler"?


----------



## deepthroat (13. August 2007)

lordfritte hat gesagt.:


> 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ß


----------

