In diesem Abschnitt werden die Klassen ifstream, ofstream und fstream beschrieben,die Operationen unterster Ebene auf Dateien und Datenströme ermöglichen. #include <iostream.h> class ios enum bin, tabexp}; enum }; #include <fstream.h> class fstreambase : virtual public ios fstreambase();
}; class ifstream : public fstreambase, public istream ifstream();
}; class ofstream : public fstreambase, public ostream ofstream();
}; class fstream : public fstreambase, public iostream fstream();
}; | |||||||||||||||||
Die Basisklasse fstreambase enthält die Standard-Definitionen der Konstruktoren undElementfunktionen für die abgeleiteten Klassen. ifstream, ofstream und fstream sind spezialisierte Versionen von istream, ostream undiostream, die sich auf Dateien beziehen. Das in diesen Klassen eingesetzte streambuf-Objekt ist also immer vom Typ filebuf. Für die folgenden Beschreibungen wird vorausgesetzt, daß
KonstruktorenIn xstream ist x entweder:
xstream steht daher für:
Die Konstruktoren für xstream sind: xstream() Hierdurch wird ein nicht geöffnetes xstream-Objekt angelegt. xstream(char * name, int mode, int prot) Ein xstream-Objekt wird angelegt, und die Datei name wird unter Verwendung von mode (als Öffnungsmodus) geöffnet. Die Parameter name und mode sind weiter unten bei open() beschrieben. xstream(int fd) Ein xstream-Objekt wird angelegt und mit dem Dateideskriptor fd verknüpft, derbereits geöffnet sein muß. xstream(int fd, char * ptr, int len) Ein xstream-Objekt wird angelegt und mit dem Dateideskriptor fd verknüpft. Zusätzlich wird das entsprechende filebuf-Objekt zur Nutzung eines len byte großen Reservierungsbereiches, beginnend bei ptr, initialisiert. Wenn ptr gleich NULL oder lengleich 0 ist, sind die filebuf-Operationen nicht gepuffert. Elementfunktionenvoid f.attach(int fd) f wird mit dem Dateideskriptor fd verknüpft. Ein Fehler tritt auf, wenn f bereits einerDatei zugeordnet ist. Bei einem Fehler wird ios::failbit im Fehlerstatus von f gesetzt. void f.close() Das entsprechende filebuf-Objekt wird geschlossen und dadurch die Verknüpfung von f mit der Datei gelöst. Der Fehlerstatus von f wird gelöscht, sofern kein Fehleraufgetreten ist. Als Fehler gilt hierbei das Auftreten eines Fehlers im C-Laufzeitsystem-Aufruf close(). void f.open(char * name, int mode, int prot) Die Datei name wird geöffnet und mit f verknüpft. Wenn die Datei noch nicht existiert,wird versucht, sie anzulegen, sofern ios::nocreate bzw. ios::in nicht gesetzt ist. Fehlertreten auf, wenn f bereits geöffnet ist oder der C-Laufzeitsystem-Aufruf open() einenFehler signalisiert. ios::failbit wird beim Auftreten eines Fehlers im Fehlerstatus von fgesetzt. Für den Dateinamen name sind folgende Angaben möglich:
Detaillierte Informationen finden Sie im Handbuch "C-Bibliotheksfunktionen". Die Elemente von open_mode sind Bits, die durch eine ODER-Operation miteinanderverknüpft werden können. (Da eine ODER-Operation einen int-Wert liefert, übernimmtopen() statt des open_mode-Argumentes einen int-Wert.) Die Bedeutung dieser Bits in mode sind: ios::app Es wird auf das Dateiende positioniert. Alle Daten, die anschließend in die Dateigeschrieben werden, werden immer an das Ende der Datei angehängt. ios::appimpliziert die Verwendung von ios::out. ios::ate Bei der Ausführung von open() wird auf das Dateiende positioniert. ios::ate impliziert nicht die Verwendung von ios::out. ios::in Die Datei wird für die Eingabe geöffnet. ios::in wird durch die Konstruktion und dasÖffnen von ifstream-Objekten implizit gesetzt. Für fstream-Objekte spezifiziert ios::in, daß Eingabeoperationen - sofern möglich - erlaubt sind. ios::in kann auchin die Modusangabe eines ostream-Objektes eingefügt werden. Das impliziert, daßdie Originaldatei (sofern existent) nicht abgeschnitten werden soll. ios::out Die Datei wird für die Ausgabe geöffnet. ios::out wird durch die Konstruktion unddas Öffnen von ofstream-Objekten implizit gesetzt. Für fstream-Objekte bedeutetdie Angabe von ios::out, daß Ausgabeoperationen erlaubt sein sollen. ios::trunc Wenn die Datei bereits existiert, wird deren Inhalt abgeschnitten (verworfen). DieserModus wird implizit gesetzt, wenn ios::out (einschließlich der impliziten Spezifikation für ofstream) angegeben ist und weder ios::ate noch ios::app angegeben werden. ios::nocreate Wenn die zu öffnende Datei nicht existiert, schlägt der Aufruf von open() fehl. ios::noreplace Wenn die Datei bereits existiert, kann die Funktion open() nicht erfolgreich ausgeführt werden. ios::bin Die Datei wird als Binärdatei geöffnet. Wenn dieser Parameter fehlt, wird die Dateials Textdatei geöffnet. ios::tabexp Für Binärdateien und Eingabedateien wird diese Angabe ignoriert. Bei Textdateienwird das Tabulatorzeichen (\t) in die entsprechende Anzahl Leerzeichen umgesetzt.Die Tabulatorpositionen haben einen Acht-Spalten-Abstand (1, 9, 17, ...). OhneAngabe des Parameters wird das Tabulatorzeichen als entsprechender EBCDIC-Wert in die Textdatei geschrieben. (Siehe Handbuch "C-Bibliotheksfunktionen") Hinweis Wird open() der Klasse istream verwendet, so ist das Bit ios::in immer gesetzt. filebuf * pfb=f.rdbuf() Ein Zeiger auf das filebuf-Objekt, das mit f verknüpft ist, wird geliefert. fstream::rdbuf() ist bedeutungsgleich mit iostream::rdbuf(). void f.setbuf(char * p, int len) Diese Zeile hat den üblichen Effekt eines Aufrufs von setbuf() (siehe filebuf()), wobei ein Speicherbereich für den Reservierungsbereich angeboten oder die nicht gepufferte Ein-/Ausgabe angefordert wird. Ein Fehler tritt auf, wenn f geöffnet oder der Aufruf f.rdbuf()->setbuf erfolglos ist. | |||||||||||||||||
BEISPIEL | Das folgende Programm öffnet die Datei #TEMP. Bei Erfolg wird ein Text in die Datei geschrieben. #include <fstream.h> #include <iostream.h> int main() { static char * name = "#TEMP"; ofstream q(name, ios::out); cout << " Datei " << name; if (q.ios::failbit) { cout << " ist geoeffnet.\n"; q << "Das ist die erste Zeile in der Datei " << name << ".\n"; } else { cout << " konnte nicht geoeffnet werden.\n"; exit (1); } return 0; } Das Ergebnis der Programmausführung ist: Datei #TEMP ist geoeffnet. % CCM0998 Verbrauchte CPU-Zeit: 0.0395 Sekunden | ||||||||||||||||
SIEHE AUCH | |||||||||||||||||