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) 150<br />

Sonst wird er Ausgabepuffer automatisch geleert, wenn er voll ist oder wenn der Stream<br />

geschlossen wird. Problematisch kann ein noch teilweise gefüllter Puffer sein, wenn das Programm<br />

wegen eines Fehlers außerplanmäßig abbricht.<br />

(12.64) Funktionen zum Lesen<br />

(a) Die Deklaration der read-Funktion, dem Äquivalent zur write-Funktion:<br />

istream& istream::read(char* ZeigerAufPuffer, int AnzBytes);<br />

Wirkungsweise:<br />

• Die Funktion liest genau AnzBytes Bytes ( Zeichen“) aus der Eingabedatei (Typ<br />

”<br />

istream oder abgeleiteter Typ, z. B. ifstream) und schreibt sie in den angegebenen<br />

Puffer ab der Adresse ZeigerAufPuffer. Hierbei wird jedes Byte gelesen und geschrieben.<br />

Ein eventuell vorhandenes Nullbyte erhält keine Sonderbehandlung, es gilt als normales<br />

Byte.<br />

• Wie schon ähnlich bei der write-Funktion beschrieben, ist es nötig, die Anfangsadresse<br />

dessen, wohin gelesen werden soll (z. B. Anfangsadresse eines Objekts, d. h. Zeiger auf<br />

Klassentyp) nach char* zu konvertieren: Parameter ZeigerAufPuffer. Das ist nur mit<br />

dem Operator reinterpret cast, s. Op2k (10.24Anm4) möglich. Ersatzweise kann auch die<br />

” missbilligte“ Typkonvertierung (char*) genommen werden, s. Op3i/(5.64b).<br />

• Der Rückgabewert ist der Stream im Zustand nach dem Lesen. Im Fehlerfall (Erreichen<br />

des Dateiendes) werden eofbit und failbit gesetzt. Wenn EOF Probleme verursachen<br />

könnte: s. (b).<br />

Bsp s. (12.66).<br />

↑↑ Angegeben ist für AnzBytes der Typ aus C++(alt) (int); in C++(neu) ist der Typ streamsize.<br />

(b) C++(neu) Falls das Erreichen des Dateiendes Probleme verursacht, kann statt der read-<br />

Funktion die Funktion readsome genommen werden:<br />

streamsize istream::readsome(char* ZeigerAufPuffer, streamsize AnzBytes);<br />

Hierbei werden ggf. weniger Zeichen gelesen, falls vorher EOF erreicht wird. Es wird kein<br />

Fehlerbit infolge Erreichen von EOF gesetzt. Der Rückgabewert der Funktion gibt die Anzahl<br />

tatsächlich gelesener Bytes an.<br />

(12.65) Positionieren bei Dateien (Binär- und Textdateien)<br />

Jeder Stream hat jeweils einen Schreib- bzw. Lesezeiger. Streams, die beschrieben und gelesen<br />

werden sollen, haben beides, die Positionen sind jedoch i. a. gleich. Bei Schreibdateien<br />

kann man i. a. nur mit dem Schreibzeiger, bei Lesedateien nur mit dem Lesezeiger arbeiten.<br />

Dieser Zeiger zeigt die nächste zu beschreibende/lesende Dateiposition an. Bei fortlaufendem<br />

Schreiben oder bei fortlaufendem Lesen benötigt man keinen direkten Zugriff auf diese<br />

Zeiger, da sie sich automatisch jeweils um die geschriebenen/gelesenen Bytes vorwärts bewegen.<br />

In manchen Fällen benötigt man jedoch gezielten Zugriff auf eine bestimmte Dateiposition:<br />

(a) Das Abfragen der aktuellen Zeigerposition geschieht mit einer tellx-Elementfunktion<br />

(mit x=p 〈put〉 beim Schreibzeiger, x=g 〈get〉 beim Lesezeiger).<br />

streampos tellp();<br />

streampos tellg();<br />

↑↑ streampos ist ein vorzeichenbehafteter Ganzzahltyp aus C++(alt); in C++(neu) lautet der Typ<br />

ios::pos type. Jedoch ist auch in C++(neu) der Typ streampos i. a. bekannt.<br />

(b) Das Setzen des Zeigers geschieht mit einer der seekx-Elementfunktionen (ebenfalls mit<br />

x=p 〈put〉 beim Schreibzeiger, x=g 〈get〉 beim Lesezeiger).<br />

ostream& seekp(streamoff Offset, ios::seek dir Bezug);<br />

ostream& seekp(streampos Position);<br />

istream& seekg(streamoff Offset, ios::seek dir Bezug);<br />

istream& seekg(streampos Position);<br />

↑↑ Angegeben sind die Typnamen aus C++(alt): streamoff, streampos, ios::seek dir; die<br />

beiden ersten sind vorzeichenbehaftete Ganzzahltypen. In C++(neu) lauten die Typnamen:<br />

ios::off type, ios::pos type, ios::seekdir (letzter: ohne Unterstrich). Jedoch sind<br />

auch in C++(neu) die Typen aus C++(alt) i. a. bekannt.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!