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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!