07.10.2013 Aufrufe

Vorlesungsskript - Hochschule Emden/Leer

Vorlesungsskript - Hochschule Emden/Leer

Vorlesungsskript - Hochschule Emden/Leer

MEHR ANZEIGEN
WENIGER ANZEIGEN

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;

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!