Vorlesungsskript - Hochschule Emden/Leer
Vorlesungsskript - Hochschule Emden/Leer
Vorlesungsskript - Hochschule Emden/Leer
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
c○ Prof. Dr. B. Bartning, HS <strong>Emden</strong>/<strong>Leer</strong> Rumpfskript ” Informatik I/II“ (WS/SS 2010/11) 53<br />
• Seiteneffekt: Zeichen/Zeichenkette wird eingelesen, Parameter wird damit belegt.<br />
• Haupteffekt: Streamobjekt (als Referenz) im Zustand nach dem Einlesen, vgl. (5.25c).<br />
↑↑ Genaueres siehe auch (Cpp/Kap. 4).<br />
△! Auch cin.get() (ohne Parameter) ist möglich, es wird der Wert des Zeichens<br />
zurückgegeben, dieser sollte an Zeichen-Variable zugewiesen werden. Aufpassen bei<br />
Nicht-Standardzeichen, z. B. bei Umlauten oder ” ß“: überraschende Effekte! (Mögliche<br />
Lösung: nach (nicht vor) dem Test auf Dateiende eine Typumwandlung auf<br />
char durchführen!) Besser: nicht benutzen. Die oben erwähnte Benutzung von<br />
get(ZeichenVariable) nach (a) ist auch bei Umlauten oder ” ß“ unproblematisch.<br />
(5.25) Fehlerbehandlung bei Streams<br />
(a) Den internen Stream-Fehlerzustand charakterisieren drei Bits, genannt<br />
eofbit, failbit, badbit,<br />
dazu noch das Pseudobit goodbit als Abwesenheit der Fehlerbits:<br />
• eofbit wird gesetzt beim Leseversuch hinter Dateiende (EOF 〈end of file〉)<br />
– zusätzlich wird dabei failbit gesetzt –,<br />
• failbit wird gesetzt bei Fehler, der vermutlich reparabel ist<br />
(z. B. Leseversuch hinter EOF, Einleseversuch Buchstabe auf int),<br />
• badbit wird gesetzt bei Fehler, der den Strom nicht mehr reparabel erscheinen lässt<br />
(z. B. Versuch, eine nicht existierende Datei zu öffnen).<br />
(b) Die Abfrage auf den Fehlerzustand erfolgt beispielsweise mit der Elementfunktion fail();<br />
sie ergibt true, wenn failbit oder badbit gesetzt ist, sonst false.<br />
Einfacher ist die Boolesche Abfrage des Streamobjekts selbst; sie ergibt den invertierten<br />
fail()-Wert:<br />
• if (StreamobjektName) ... entspricht if (!StreamobjektName.fail()) ...<br />
• if (!StreamobjektName) ... entspricht if (StreamobjektName.fail()) ...<br />
(c) Viele Ausdrücke mit einem Streamobjekt als Operand ergeben als Haupteffekt das Streamobjekt<br />
selbst (genauer: Referenz darauf (7.31)), und zwar im Zustand nach der Operation.<br />
Also sind auch diese Ausdrücke Boolesch abfragbar, um den Fehlerzustand des Streamobjekts<br />
zu erfahren. Dadurch ergibt sich die elegante Möglichkeit, Lesen und Abfragen des<br />
Fehlerzustandes danach in einem Ausdruck zu formulieren.<br />
Bsp1 Links: drei Ausdrucksanweisungen; der Haupteffekt des Gesamtausdrucks vor dem Semikolon (wird hier<br />
verworfen (3.32a)) ist jeweils das Streamobjekt selbst im Zustand nach der Operation – zu get() s. (5.24a);<br />
Mitte: Fehlerabfrage mit fail (WAHR bei Fehler);<br />
Rechts: Kombination beider Teile mit negierter Boolescher Abfrage (ebenfalls WAHR bei Fehler):<br />
cin >> Variable; if (cin.fail()) ... if (!(cin >> Variable)) ...<br />
cout zahl;<br />
while (cin.fail()) {<br />
// Fehlerbehandlung nach (d)<br />
cin >> zahl;<br />
}<br />
/* 2 */ cin >> zahl;<br />
while (!cin) {<br />
// Fehlerbehandlung nach (d)<br />
cin >> zahl;