Dateien und Verzeichnisse

Jede Ein- und Ausgabe von Daten erfolgt in C über Datenkanäle (“Files”). Beim Programmstart werden automatisch die Standard-Files stdin, stdout und stderr geöffnet und mit dem Bildschirm verknüpft. Somit muss in Programmen nur die Standard-Bibliothek stdio.h eingebunden werden, damit Daten beispielsweise mittels printf() auf dem Bildschirm ausgegeben oder mittels scanf() von der Tastatur eingelesen werden können.[1]

Dateien und File-Pointer

Auf Dateien wird in C grundsätzlich über FILE-Objekte zugegriffen: Sämtliche Datenfunktionen benötigen oder liefern einen Zeiger auf ein solches Objekt. Am Anfang der Quellcode-Datei muss also zunächst ein solcher File-Pointer, bisweilen auch “Stream” genannt, definiert werden:

#include <stdio.h>

FILE *fp;

Um eine Datei zu öffnen, wird die Funktion fopen() verwendet. Als erstes Argument wird hierbei der Pfadname der zu öffnenden Datei übergeben, als zweites ein Zeichen, das den Zugriffsmodus auf die Datei angibt:

  • "r": Textdatei zum Lesen öffnen
  • "w": Textdatei zum Schreiben neu erzeugen (gegebenenfalls alten Inhalt wegwerfen)
  • "a": Text anfügen; Datei zum Schreiben am Dateiende öffnen oder erzeugen
  • "r+": Textdatei zum Ändern öffnen (Lesen und Schreiben)
  • "w+": Textdatei zum Ändern erzeugen (gegebenenfalls alten Inhalt wegwerfen)
  • "a+": Datei neu erzeugen oder zum Ändern öffnen und Text anfügen (Schreiben am Ende)

Als Ergebnis gibt fopen() einen File-Pointer auf die Datei zurück, oder NULL, falls beim Öffnen ein Fehler aufgetreten ist.

fp = fopen("/path/to/myfile","r");

if (fp == NULL)
    fprintf(stderr,"Datei konnte nicht geoeffnet werden.\n");

Wird der Zugriff auf eine Datei nicht mehr benötigt, so sollte sie mittels fclose() wieder geschlossen werden. Hierbei muss als Argument der zur geöffneten Datei gehörende File-Pointer angegeben werden, also beispielsweise fclose(fp). Bei einem Schreibzugriff ist das Schließen einer Datei mittels fclose() Pflicht, da hierdurch unter anderem die Modifikationszeit der Datei aktualisiert wird.

Existenz einer Datei prüfen

In C gibt es keine eigenständige Funktion, um die Existenz einer Datei zu prüfen. Man kann allerdings die Funktion fopen() auch zu diesem Zweck nutzen:

// Existenz einer Datei prüfen
// Rückgabewert: 1 falls Datei existiert, 0 sonst.
int file_exists(char *filename)
{
    FILE *fp;
    int result;

    fp = fopen(filename, "r");
    if (fp == NULL)
    {
        result = 0;
    }
    else
    {
        result = 1;
        fclose(fp);
    }

    return result;
}

Hierbei wurde als Zugriffsmodus "r" gewählt, da die Datei nicht verändert werden soll und die Methode auch mit schreibgeschützten Dateien funktionieren soll. Die Rückgabewerte wurden im obigen Beispiel so gewählt, damit sie an einer anderen Stelle im Code innerhalb einer if-Abfrage genutzt werden können.

Daten in eine Datei schreiben

Wie bereits im Abschnitt Ausgabe und Eingabe beschrieben wurde, gibt es in C mehrere Möglichkeiten, um Daten von der Tastatur beziehungsweise vom Bildschirm (“stdin”) einzulesen. Ebenso gibt es in C mehrere Möglichkeiten, um Inhalte aus Dateien einzulesen oder dorthin zu schreiben. Die einzelnen Funktionen sind dabei den bereits behandelten Funktionen sehr ähnlich.

fprintf() – Daten formatiert schreiben

Mit fprintf() können normale Zeichenketten, Sonderzeichen und Werte von Variablen mittels Platzhaltern in formatierter Weise in eine Datei geschrieben werden. Die Syntax entspricht dabei derjenigen von printf(), wobei als erstes Argument der Name eines File-Pointers angegeben werden muss:

FILE *fp;

// Datei öffnen:
fp = fopen(filename, "w");

// Daten schreiben:
fprintf(fp, "Teststring!\n");

// Datei schließen:
fclose(fp);

Sollen bei der Verwendung von fprintf() mehrere Zeilen auf einmal geschrieben werden, so müssen diese mittels des Neue-Zeile-Zeichens \n getrennt werden. Am Ende des Schreibvorgangs muss die Datei wieder mittels fclose() geschlossen werden, damit die Modifikationszeit angepasst wird.

fputs() – Einzelne Zeichenketten schreiben

Mit fputs() können normale Zeichenketten in eine Datei geschrieben werden. Sonderzeichen in den Zeichenketten sind erlaubt, ein Ersetzen von Platzhaltern durch Werte von Variablen hingegen nicht.

fputc() – Einzelne Zeichen schreiben

Daten aus einer Datei einlesen

Auch die Funktionen zum Einlesen von Daten aus einer Datei ähneln denen im Abschnitt Ausgabe und Eingabe beschriebenen Funktionen zum Einlesen von Daten vom Bildschirm.

fgetc() – Daten zeichenweise einlesen

Die Funktion fgetc() liest ein einzelnes Zeichen aus einer Datei ein und gibt es als int-Wert zurück. Vor Verwendung von fgetc() muss wiederum zunächst ein File-Pointer mittels fopen() bereitgestellt werden:

Die Funktion fgetc() wird häufig in Verbindung mit einer while-Schleife eingesetzt, wobei als Abbruchfunktion die Funktion feof() genutzt wird: Diese prüft, ob der angegebene File-Pointer auf das Ende der Datei zeigt und gibt in diesem Fall einen Wert ungleich Null zurück.


Anmerkungen:

[1]Programme, deren einzige Aufgabe darin besteht, Daten vom Bildschirm einzulesen, zu verarbeiten, und wieder auf dem Bildschirm auszugeben, werden bisweilen auch als “Filter” bezeichnet. Derartige Programme können unter Linux mittels des Pipe-Zeichens verbunden werden, beispielsweise kann so in einer Shell programm_1 | programm_2 | programm_3 eingegeben werden.