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. |