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) 151<br />
(12.66) Beispiel:<br />
Das Positionieren (Setzen des Dateizeigers) kann relativ oder absolut geschehen:<br />
• Funktion mit zwei Parametern: relative Positionierung, und zwar bezogen entweder<br />
auf den Dateianfang, auf die aktuelle Position oder auf das Dateiende, anzugeben durch<br />
den zweiten Parameter in Form von einer der drei Aufzählungskonstanten:<br />
ios::beg 〈begin〉: relativ zum Dateianfang,<br />
ios::cur 〈current〉: relativ zur aktuellen Position,<br />
ios::end 〈end〉: relativ zum Dateiende.<br />
Der erste Parameter der seekx-Funktion gibt den Offset an. Grundsätzlich ist es nicht<br />
erlaubt, vor den Dateianfang oder hinter das Dateiende zu positionieren, daher gilt<br />
Offset 0 bei Bezug auf Dateianfang, Offset 0 bei Dateiende.<br />
• Funktion mit einem Parameter: absolute Positionierung, d. h. das Positionieren<br />
bezogen auf den Dateianfang (wirkt wie ios::beg als zweiter Parameter).<br />
Der Zahlenwert von Position oder Offset bedeutet bei Binärdateien Anzahl Bytes. Bei Textdateien<br />
ist die Interpretation schwieriger, da die Betriebssystem-Darstellung und die C ++-<br />
Darstellung beispielsweise des Zeilenendes unterschiedlich sein kann, siehe (5.31). Bei Textdateien<br />
sollte daher i. a. nur ein vorher gemerkter tellx-Wert als Parameter für absolute<br />
Positionierung genommen werden (Wiederauffinden einer vorher gemerkten Position). Bei<br />
Binärdateien ist das Positionieren problemloser; am besten setzt man die gesuchte Stelle<br />
unter Zuhilfenahme des sizeof-Operators Op3j (5.14), vgl. Beispiel (12.66); dadurch benötigt<br />
man keine Kenntnisse über die interne Repräsentation der Daten.<br />
Bsp Zurück zum Dateianfang bei Lesedatei:<br />
LeseStreamName.seekg(0);<br />
Zum Dateiende bei Schreibdatei:<br />
SchreibStreamName.seekp(0,ios::end);<br />
Positionieren auf letztes Objekt des Typs T beim Lesen (die Typkonversion in einen vorzeichenbehafteten<br />
Ganzzahltyp – hier long – ist notwendig, da sizeof vorzeichenlos ist):<br />
LeseStreamName.seekg(-long(sizeof(T)),ios::end);<br />
Ignorieren des folgenden Objekts des Typs T beim Lesen:<br />
LeseStreamName.seekg(sizeof(T),ios::cur);<br />
// Beispieldatei D12-66.CPP<br />
// (eigentlich wie angedeutet in drei Dateien aufzuteilen)<br />
#include <br />
#include <br />
using namespace std;<br />
// ***** Headerdatei für Klasse Datum *****<br />
class Datum {<br />
int tag, monat, jahr;<br />
public:<br />
Datum(int t=1, int monat=1, int jahr=2000);<br />
void setzDatum(int t, int m, int j);<br />
int gibTag() const {return tag; }<br />
int gibMonat() const {return monat; }<br />
int gibJahr() const {return jahr; }<br />
};<br />
// Überladung des Eingabeoperators für Lesen eines Datums aus<br />
// Textstrom wie z. B. Standardeingabe (Format: 3 Ganzzahlen)<br />
istream& operator>> (istream &ein, Datum &d);<br />
// Überladung des Ausgabeoperators für Schreiben eines Datums in<br />
// Textstrom wie z. B. Standardausgabe<br />
ostream& operator> (ifstream &ein, Datum &d);