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) 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.