Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

fstream Spezialisierung von iostream und streambuf auf Dateien

&pagelevel(3)&pagelevel


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
{
public:

enum seek_dir {beg, cur, end};
enum open_mode {in, out, ate, app, trunc, nocreate, noreplace,

bin, tabexp};

enum io_state {goodbit=0, eofbit, failbit, badbit};
// siehe ios, dort finden Sie weitere Klassenelemente ...

};

#include <fstream.h>

class fstreambase : virtual public ios
{
public:

fstreambase();
˜fstreambase();
fstreambase(const char* name, int mode, int prot=filebuf::openprot);
fstreambase(int fd);
fstreambase(int fd, char * p, int l);

void
void
void

attach(int fd);
close();
open(const char* name, int mode, int prot=filebuf::openprot);

filebuf*
void

();
setbuf(char* p, int l);

};

class ifstream : public fstreambase, public istream
{
public:

ifstream();
˜ifstream();
ifstream(const char* name, int mode=ios::in, int prot=filebuf::openprot);
ifstream(int fd);
ifstream(int fd, char* p, int l);

void

open(const char* name, int mode=ios::in, int prot=filebuf::openprot);

filebuf*

rdbuf();

};

class ofstream : public fstreambase, public ostream
{
public:

ofstream();
˜ofstream();
ofstream(const char* name, int mode=ios::out, int prot =filebuf::openprot);ofstream(int fd);
ofstream(int fd, char* p, int l);

void

open(const char* name, int mode=ios::out, int prot=filebuf::openprot);

filebuf*

rdbuf();

};

class fstream : public fstreambase, public iostream
{
public:

fstream();
˜fstream();
fstream(const char* name, int mode, int prot =filebuf::openprot);
fstream(int fd);
fstream(int fd, char* p, int l);

void

open(const char* name, int mode, int prot=filebuf::openprot);

filebuf*

rdbuf();

};



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ß

  • f vom Typ ifstream, ofstream oder fstream ist.
  • mode ein int-Wert ist, der open_mode darstellt.

Konstruktoren

In xstream ist x entweder:

  • if
  • of oder
  • f.

xstream steht daher für:

  • ifstream
  • ofstream oder
  • fstream.

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.
Der Parameter prot wird im BS2000 ignoriert.
Im Fehlerstatus (io_state) des angelegten xstream-Objektes wird ein Fehler angezeigt,wenn die Datei nicht erfolgreich geöffnet werden konnte.

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.

Elementfunktionen

void 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.
Der Parameter prot wird im BS2000 ignoriert.

Für den Dateinamen name sind folgende Angaben möglich:

  • jeder gültige BS2000-Dateiname
  • "link=linkname" linkname bezeichnet einen BS2000-Linknamen
  • "(SYSDTA)", "(SYSOUT)", "(SYSLST)" die entsprechende Systemdatei
  • "(SYSTERM)" Terminal-Ein-/Ausgabe
  • "(INCORE)" temporäre Binärdatei, die nur im virtuellen Speicher angelegt wird

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.
Wenn die zu öffnende Datei nicht existiert, schlägt der Aufruf von open() fehl.

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.
Wird open() der Klasse ostream verwendet, so ist das Bit ios::out 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


filebuf, ios, istreamostream, sbufprotsbufpub