Programmiersprache C/C++

Dateiarbeit

fopen

  #include <stdio.h>

  FILE *fopen(const char *filename, const char *mode);
öffnet einen Stream.
fopen öffnet die durch filename bezeichnete Datei und ordnet ihr einen Stream zu. Zurückgeliefert wird ein Zeiger auf diesen Stream, über den weitere Operationen mit diesem Stream ausgeführt werden können.

Der Parameter mode kann einen der folgenden Werte annehmen:

Wert	Beschreibung
--------------------------------------------------------------------------
r	Öffnung ausschließlich für Leseoperationen.
w	Erzeugung einer Datei für Schreiboperationen. Falls die Datei
        bereits existiert, wird sie überschrieben.
a	Öffnung für Schreiboperationen. Falls die Datei bereits 
        existiert, werden zusätzliche Informationen an das aktuelle 
        Dateiende angefügt, ansonsten wird sie automatisch erzeugt.
r+	öffnung einer Datei für Lese- und Schreiboperationen.
        Die Datei muß bereitsexistieren.
w+	Erzeugung einer neuen Datei für Lese- und Schreiboperationen.
        Falls die Datei bereits existiert, wird sie überschrieben.
a+	Öffnung einer Datei zum Lesen und Anhängen neuer Daten durch
        Schreiboperationen. Falls die Datei bereits existiert, bleibt
        ihr alter Inhalt erhalten - falls nicht, wird sie automatisch
        erzeugt.
Bei der Öffnung kann zusätzlich explizit angegeben werden, ob die Datei im Modus bearbeitet werden soll.
Diese Unterscheidung ist für manche, aber nicht alle Betriebssysteme relevant. Die Angabe geschieht durch ein einfaches Anhängen des jeweiligen Buchstabens (also wb, w+b, rb usw.). Im Parameter mode kann bei fopen das Zeichen b bzw. t auch zwischen den Buchstaben und dem Pluszeichen eingefügt werden. So ist beispielsweise rb+ identisch mit r+b.

Mit r+ und w+ erzeugte Dateien können sowohl gelesen als auch beschrieben werden:
Zwischen einem Wechsel von "Schreiben" nach "Lesen" muß allerdings ein Aufruf von fseek oder rewind stattfinden.
Zwischen einem Wechsel von "Lesen" nach "Schreiben" muß ebenfalls fseek oder rewind stattfinden, es sei denn, die Leseoperation hat das Dateiende erreicht.

Rückgabewert:
fopen liefert bei fehlerfreier Ausführung einen Zeiger auf den neu geöffneten Stream, im Falle eines Fehlers den Wert NULL zurück.

Hinweise:

Beispiel:
Bedeutung der Festlegung Text- oder Binärdatei unter DOS
  #include <stdio.h>

  int main(void)
  {
    FILE *f;

    f = fopen("binary.dat", "wb");
    fprintf(f, "Hello\nWorld\n");
    fclose(f);

    f = fopen("text.dat", "w");
    fprintf(f, "Hello\nWorld\n");
    fclose(f);

    return 0;
  }
Datei binary.dat
  Hello
       World
Datei text.dat
  Hello
  World

freopen

  #include <stdio.h>

  int freopen(const char *filename, const char*mode, FILE *stream);
Ordnet einem offenen Stream eine neue Datei zu.
freopen ersetzt die zu stream gehörende, offene Datei durch die über den Parameter filename angegebene Datei. Dabei wird - unabhängig vom Erfolg des anschliessenden Öffnens - der Stream in jedem Fall geschlossen. Meistens wird diese Funktion verwendet, um stdin, stdout und stderr eine andere Datei zuzuordnen.

Der Parameterstring mode kann einen der folgenden Werte annehmen:

Wert	Beschreibung
---------------------------------------------------------------------------
r	Öffnung ausschließlich für Leseoperationen.
w	Erzeugung einer Datei für Schreiboperationen.
a	Öffnung für Schreiboperationen. Falls die Datei bereits
        existiert, werden zusätzliche Informationen an das aktuelle
        Dateiende angefügt, ansonsten wird sie automatisch erzeugt.
r+	Öffnung einer Datei für Lese- und Schreiboperationen.
        Die Datei muß bereits existieren.
w+	Erzeugung einer neuen Datei für Lese- und Schreiboperationen.
a+	Öffnung einer Datei zum Lesen und Anhängen neuer Daten durch
        Schreiboperationen. Falls die Datei bereits existiert, bleibt
        ihr alter Inhalt erhalten - falls nicht, wird sie automatisch
        erzeugt.
Bei der Öffnung kann zusätzlich explizit angegeben werden, ob die Datei im Binär-Modus bearbeitet werden soll.
Mit r+ und w+ erzeugte Dateien können sowohl gelesen als auch beschrieben werden. Zwischen einem Wechsel von "Schreiben" nach "Lesen" muß allerdings ein fseek oder rewind aufgerufen. Auch bei einem Wechsel von "Lesen" nach "Schreiben" muß fseek oder rewind aktiviert werdden, es sei denn, die Leseoperation hat das Dateiende erreicht.

Rückgabewert:
freopen liefert bei fehlerfreier Ausführung das Argument stream, im Fehlerfall den Wert NULL zurück.


fclose

  #include <stdio.h>

  int fclose(FILE *stream);
Schließt einen Stream.
fclose schließt den durch stream angegebenen Stream, wobei alle zum Stream gehörenden Puffer zuvor auf geschrieben werden. Durch das System reservierte Puffer werden durch fclose freigegeben. Puffer, die mit setbuf oder setvbuf zugeordnet wurden, werden nicht automatisch freigegeben (es sei denn, beim Aufruf von setvbuf wurde als Pufferzeiger der Wert NULL übergeben).

Rückgabewert:
fclose liefert bei fehlerfreier Ausführung den Wert 0, im Fehlerfall den Wert EOF zurück.


fflush

  #include <stdio.h>

  int fflush(FILE *stream);
Schreibt den Ausgabepuffer eines Stream in die zugeordnete Datei.
fflush erzwingt bei gepufferten Ausgabe-Streams ein Schreiben eventueller Pufferinhalte, sorgt also dafür, daß ausgegebene Daten in die zugehörige Datei geschrieben werden.
Der durch stream bezeichnete Stream bleibt offen. Auf ungepufferte Streams hat fflush keine Auswirkung.

Rückgabewert:
Bei fehlerfreier Ausführung liefert fflush den Wert 0, im Fehlerfall den Wert EOF zurück.

Hinweis:
Wird ein Programm illegal beendet (z.B. Rechnerausfall), so gehen Daten, die vom Programm zwar ausgegeben wurden, sich aber noch im Ausgabepuffer befinden, verloren.
Der Ausgabepuffer ermöglicht ein effektiveres Arbeiten, birgt aber das Risiko eines möglichen Datenverlusts in sich. Nach der Ausgabe sehr wichtiger Daten kann durch einen sofort nachfolgenden Aufruf von fflush dieses Risiko beseitigt werden.


rewind

  #include <stdio.h>

  void rewind(FILE *stream);
Setzt einen Dateizeiger auf den Stream-Anfang.
rewind ist äquivalent zu fseek(stream, 0L, SEEK_SET).
Anders als fseek löscht rewind nicht nur das Dateiende-Flag, sondern auch eventuell gesetzte Fehler-Flags.
In Dateien, die für Lese- und Schreiboperationen geöffnet worden sind, kann nach rewind zwischen "Lesen" und "Schreiben" gewechselt werden.

Rückgabewert: keiner


fseek

  #include <stdio.h>

  long int fseek(FILE *stream, long int offset, int wherefrom);
Positioniert den Dateizeiger eines geöffneten Streams. offset ist eine relative Positionsangabe.
wherefrom legt fest, worauf sich offset bezieht.
Es sind folgende Angaben möglich:
  SEEK_SET       Dateianfang
  SEEK_CUR       aktuelle Position des Dateizeigers
  SEEK_END       Dateiende
Beispiel:
Ermittlung der Länge einer geöffneten Datei
  #include <stdio.h>

  long filesize(FILE *stream)
  {
    long curpos, length;

    curpos = ftell(stream);
    fseek(stream, 0L, SEEK_END);
    length = ftell(stream);
    fseek(stream, curpos, SEEK_SET);
    return length;
  }

  int main(void)
  {
    FILE *stream;

    stream = fopen("test.txt", "w+");
    fprintf(stream, "Dies ist ein Test");
    printf("Laenge von test.txt : %ld Byte\n", filesize(stream));
    fclose(stream);
    return 0;
  }

ftell

  #include <stdio.h>

  long int ftell(FILE *stream);
Liefert den aktuellen Dateizeiger.
ftell liefert den aktuellen Dateizeiger von stream zurück. Die Position wird relativ zum Dateianfang in Bytes gemessen (falls es sich um eine Binärdatei handelt). Der von ftell zurückgelieferte Wert kann bei einem nachfolgenden Aufruf von fseek verwendet werden.

Rückgabewert:
ftell liefert bei fehlerfreier Ausführung die aktuelle Position des Dateizeigers zurück. Im Fehlerfall ist der Rückgabewert -1L und die globale Variable errno wird auf einen der beiden folgenden Werte gesetzt:

  EBADF     Ungültiger Dateizeiger
  EINVAL    Suche auf diesem Gerät nicht möglich
Beispiel:
  #include <stdio.h>

  int main(void)
  {
    FILE *stream;

    stream = fopen("test.txt", "w+");
    fprintf(stream, "Dies ist ein Test");
    printf("Der Dateizeiger ist auf Byte %ld\n", ftell(stream));
    fclose(stream);

    return 0;
  }

ferror

  #include <stdio.h>

  int ferror(FILE *stream);
Prüft Fehlerbedingungen bei Streams.
ferror ist ein Makro, das den über stream angegebenen Stream auf Schreib- und Lesefehler prüft. Das Fehler-Flag eines Stream bleibt nach einem Fehler solange gesetzt, bis entweder clearerr oder rewind aufgerufen oder der Stream geschlossen wird.

Rückgabewert: ferror liefert einen Wert ungleich Null zurück, wenn das Fehler-Flag des angegebenen stream gesetzt ist, sonst den Wert 0.


clearerr

  #include <stdio.h>

  void clearerr(FILE *stream);
Setzt das Fehler- und das Dateiende-Flag für einen bestimmten Stream zurück.
clearerr setzt das Fehler-Flag und das Dateiende-Flag des durch stream bezeichneten Stream auf 0 zurück. Das Fehler-Flag einer Datei bleibt nach einem Fehler solange gesetzt, bis entweder clearerr oder rewind aufgerufen werden. Das Dateiende-Flag wird bei jeder Eingabeoperation in die Datei zurückgesetzt.

Rückgabewert: Keiner


setbuf

  #include <stdio.h>

  void setbuf(FILE *stream, char *buf);
Explizite Zuordnung eines Puffers zu einem Stream.
setbuf ordnet der durch stream angegebenen Datei den Puffer buf anstelle des automatisch vergebenen Puffers zu. Die Minimalgröße von buf ist durch die in stdio.h definierte Konstante BUFSIZ festgelegt. Die Funktion kann nur angewendet werden, wenn die Datei bereits offen ist. Die Angabe des Zeigerwertes NULL für buf bewirkt, daß folgende Ein-/Ausgaben über stream ungepuffert arbeiten, d.h. Ausgaben geschehen sofort, Eingaben werden direkt vom entsprechenden Gerät gelesen. stdin und stdout arbeiten ungepuffert, wenn sie nicht umgeleitet sind. Umleitungen bewirken dagegen normalerweise eine Pufferung, die mit setbuf verändert werden kann.

Die Pufferung von Ein- und Ausgaben bedeutet: Ausgaben werden zeichenweise zwischengespeichert und blockweise geschrieben; Eingaben werden blockweise von der Datei bzw. dem Gerät gelesen und danach zeichenweise aus dem Puffer gelesen.
setbuf darf nur direkt nach dem Öffnen (oder direkt nach einem fseek-Aufruf) auf einen Stream angewendet werden, da die Ergebnisse ansonsten unvorhersehbar sind. Die Anwendung dieser Funktion auf ungepufferte Dateien ist dagegen problemlos und jederzeit möglich. Für buf kann eine lokale Variable verwendet werden. Man sollte allerdings in diesem Fall streng darauf achten, die Datei vor dem Ende der entsprechenden Funktion wieder zu schließen.

Rückgabewert: keiner


setvbuf

  #include <stdio.h>

  int setvbuf(FILE *stream, char *buf, int type, size_t size);
Explizite Zuordnung eines Puffers zu einem Stream.
setvbuf ordnet der durch stream angegebenen Datei den Puffer buf anstelle des automatisch vergebenen Puffers zu. Die Funktion kann nur angewendet werden, wenn die Datei bereits offen ist.
Mit der Angabe des Zeigerwertes NULL für buf wird über einen Aufruf von malloc ein Puffer der Größe size reserviert und der Datei zugeordnet.
Der Puffer wird automatisch freigegeben, wenn die Datei wieder geschlossen wird. Der Parameter size bestimmt die Puffergröße und muß größer als 0 sein. size darf nicht größer sein als die in limits.h definierte Konstante UINT_MAX.
stdin und stdout arbeiten ungepuffert, solange sie nicht umgeleitet sind. Umleitungen bewirken dagegen vollständige Pufferung. Ungepuffert bedeutet, daß Zeichen, die in einen Stream ausgegeben werden sollen, unmittelbar in die Datei bzw. das Gerät geschrieben werden. Gepuffert bedeutet hingegen, daß die auszugebenden Zeichen zunächst gesammelt und dann blockweise geschrieben werden.

Der Parameter type muß den Wert einer der drei folgenden Konstanten enthalten:

  _IOFBF   Die Datei wird vollständig gepuffert. 
           Wenn der Puffer leer ist, versucht der nächste Eingabebefehl, 
           den Puffer komplett mit Daten zu füllen (liest also size Bytes).
           Bei Ausgaben wird zunächst der Puffer gefüllt, erst danach
           wird der komplette Pufferinhalt geschrieben.
  _IOLBF   Ausgaben werden zeilenweise gepuffert: der Pufferinhalt wird
           nach jeder Ausgabe eines Zeilenvorschubs physikalisch
           geschrieben. Eingaben arbeiten dagegen genauso wie bei
           vollständiger Pufferung.
  _IONBF   Die Datei ist ungepuffert. Die Parameter buf und size werden
           ignoriert. Jeder Eingabebefehl liest direkt von der Datei,
           jeder Ausgabebefehl hat eine sofortige Schreibaktion zur Folge.
Für buf kann eine lokale Variable verwendet werden - allerdings sollte man in diesem Fall darauf achten, die Datei vor dem Ende der entsprechenden Funktion wieder zu schließen.

Rückgabewert:
setvbuf liefert bei fehlerfreier Ausführung den Wert 0. Ungültige Werte für type oder size, fehlender Speicherplatz für malloc oder die Anwendung auf eine nicht geöffnete Datei erzeugen ein Funktionsergebnis ungleich Null.


fprintf

  #include <stdio.h>

  int fprintf(FILE *stream, const char *format, ...);
Textausgabe in einen offenen Stream.
format gibt die Vorschrift an, wie die Werte der nachfolgenden Parameter (Ausgabeparameter) in das Textformat zu überführen sind.
format kann Format-Deskriptoren und/oder festen Text enthalten (siehe printf).
Die Anzahl der Ausgabeparameter ist variabel (endliche Anzahl größer oder gleich Null).
Rückgabewert:
sprintf liefert einen Wert ungleich EOF zurück, falls bei der Ausgabe kein Fehler aufgetreten ist.
Bei vielen Systemen entspricht der Rückgabewert bei erfolgreicher Ausführung der Anzahl der geschriebenen Zeichen.


fscanf

  #include <stdio.h>

  int fscanf(FILE *stream, const char *format, ...);
Texteingabe aus einem offenen Stream.
format gibt die Vorschrift an, wie die Werte der nachfolgenden Parameter (Eingabeparameter) aus dem Textformat in einem dem Typ des jeweiligen Parameter adäquate Form zu überführen sind.
format kann Format-Deskriptoren und/oder festen Text enthalten (siehe scanf).
Die Anzahl der Eingabeparameter ist variabel (endliche Anzahl größer oder gleich Null).
Rückgabewert:
fscanf liefert die Anzahl der laut Format-Vorschrift erfolgreich gelesenen Werte zurück.


fwrite

  #include <stdio.h>

  size_t fwrite(void *ptr, size_t element_size, size_t count, FILE *stream);
Binärausgabe in einen offenen Stream.
ptr ist ein Zeiger auf ein Array, welches count Komponenten umfaßt, die jeweils element_size Byte lang sind.
Die Komponente eines solchen Arrays wird häfig auch als Datensatz bezeichnet.
Datensätze können eine reguläre interne Struktur besitzen, z.B. definiert durch struct, können aber auch willkürlich gebildet werden.
stream verweist auf den zu verwendenden Stream.

Rückgabewert:
fwrite liefert die Anzahl der erfolgreich geschriebenen Datensätze zurück, d.h. bei erfolgreicher Ausgabe ist der Rückgabewert identisch mit count.


fread

  #include <stdio.h>

  size_t fread(void *ptr, size_t element_size, size_t count, FILE *stream);
Binäreingabe aus einem offenen Stream.
Die Parameter entsprechen denen von fwrite.

Rückgabewert:
fread liefert die Anzahl der erfolgreich gelesenen Datensätze zurück, d.h. bei erfolgreicher Eingabe ist der Rückgabewert identisch mit count.

Beispiel:

  #include <stdio.h>
  
  #define FILENAME "test.dat"
  
  int main(void)
  {
    FILE *f;
    int i;
    typedef struct {
      char name[20];
      char vorname[20];
      int alter;
      float konto;
    } person;
    person p[3], pp[3];
  
    strcpy(p[0].name, "Meier"); strcpy(p[0].vorname, "Otto");
    p[0].alter = 66; p[0].konto = 4444.44;
    strcpy(p[1].name, "Meier"); strcpy(p[1].vorname, "Ottolie");
    p[1].alter = 66; p[1].konto = 444444.44;
    strcpy(p[2].name, "Krause"); strcpy(p[2].vorname, "Wilhelm");
    p[2].alter = 53; p[2].konto = 5555.55;
  
    if ( ! ( f = fopen(FILENAME, "wb") ) ) {
      fprintf(stderr, "%s kann nicht erstellt werden\n", FILENAME);
      exit(1);
    }
  
    fwrite(p, sizeof(person), 3, f);
  
    if ( ! freopen(FILENAME, "rb", f) ) {
      fprintf(stderr, "%s kann nicht gelesen werden\n", FILENAME);
      exit(2);
    }
  
    fread(pp, sizeof(person), 3, f);
  
    for ( i=0; i<3; i++ ) 
      printf("%-20s %-20s %3d %12.2f\n", pp[i].vorname, pp[i].name, pp[i].alter,
             pp[i].konto);
  
    return 0;
  }

fgetc

  #include <stdio.h>

  int fgetc(FILE *stream);
Eingabe eines einzelnen Zeichens aus einem offenen Stream.

Rückgabewert:
fgetc liefert den Ordinalwert des eingelesenen Zeichens.
Wurde das Dateiende erreicht, so wird EOF zurückgeliefert.

Hinweis:
Wird aus einer Binärdatei gelesen, so liefert EOF keine sichere Aussage darüber, ob wirklich das Dateiende erreicht wurde. Dies ist nur mit Hilfe der Funktion feof feststellbar.


getc

  #include <stdio.h>

  int getc(FILE *stream);
Eingabe eines einzelnen Zeichens aus einem offenen Stream.
Erfüllt die gleiche Aufgabe wie fgetc, ist jedoch als Makro realisiert. getc ist damit schneller als fgetc, kann jedoch nicht als Parameter an eine Funktion übergeben werden.


fputc

  #include <stdio.h>

  int fputc(FILE *stream);
Ausgabe eines einzelnen Zeichens in einen offenen Stream.

Rückgabewert:
Bei erfolgreicher Ausgabe liefert fputc den Ordinalwert des ausgegebenen Zeichens zurück, im Fehlerfall den Wert EOF.


putc

  #include <stdio.h>

  int putc(FILE *stream);
Ausgabe eines einzelnen Zeichens in einen offenen Stream.
Erfüllt die gleiche Aufgabe wie fputc, ist jedoch als Makro realisiert. putc ist damit schneller als fputc, kann jedoch nicht als Parameter an eine Funktion übergeben werden.


ungetc

  #include <stdio.h>

  int unget(int ch, FILE *stream);
Stellt das Zeichen ch in den Eingabepuffer eines Streams.
Das Zeichen wird nur in den Puffer, nicht aber in den Stream selbst gestellt !
Eine nachfolgende Eingabeoperation liefert als erstes das eingestellte Zeichen (falls nicht durch andere zwischengeschaltete Operationen der Puffer gelöscht wird).
EOF kann nicht in den Puffer geschrieben werden.


feof

  #include <stdio.h>

  int feof(FILE *stream);
Ermittelt, ob bei einer vorausgegangenen Leseoperation in einem Stream das Dateiende erreicht wurde.

Rückgabewert:
Der Rückgabewert ist gleich Null, wenn das Dateiende noch nicht erreicht wurde, ansonsten ist er von Null verschieden.


tmpnam

  #include <stdio.h>

  char *tmpnam(char *buf);
Erzeugt einen eindeutigen Namen für eine temporäre Datei.
Die Eindeutigkeit des Namens ist für TMP_MAX Aufrufe von tmpnam garantiert.

Der Aufbau des generierten Namens ist systemspezifisch. Es kann gegebenenfalls ein vollständiger Pfadname sein, der auf ein speziell für temporäre Dateien vorgesehenes Verzeichnis verweist.

Beispiel:

  #include <stdio.h>

  int main(void)
  {
    int i;
    char buf[FILENAME_MAX];

    for (i=0; i<20; i++)
      printf("%2d: %s\n", i, tmpnam(buf));

    return 0;
  }

tmpfile

  #include <stdio.h>

  FILE *tmpFILE(void);
Erzeugt eine temporäre Datei und eröffnet sie im Modus w+b.
Es handelt sich dabei um eine Binärdatei, in der geschrieben und gelesen werden kann und die mit Schließem der Datei bzw. mit Programmende automatisch gelöscht wird.

Rückgabewert:
Der Rückgabewert ist NULL, wenn die temporäre Datei nicht angelegt werden kann, ansonsten ist er von NULL verschieden.

Beispiel:

  #include <stdio.h>

  #define n 50

  int main(void)
  {
    FILE *f;
    char buf[n];

    f = tmpfile();               /* Temporaere Datei anlegen */
    fprintf(f, "Das wird in eine temporaere Datei geschrieben\n");
    rewind(f);
    fgets(buf, n, f);            /* Lesen aus der temporaeren Datei */
    printf("%s", buf);

    return 0;
  }

Zurück zum Menü
Zurück zur vorigen Seite Weiter zur nächsten Seite

P. Böhme, 10.03.1996