ein Kapitel zurück                                           ein Kapitel weiter

Nun kommen wir endlich zum Zugriff auf Dateien. Das Dateien-Konzept, also die Bearbeitung von Dateien, erfolgt in C immer zeichenorientiert. In C sind Dateien nichts anderes als zunächst eine unstrukturierte Folge von Einzelzeichen. Das heißt es spielt keine Rolle ob sie nun mit einer Datenbank einer Textdatei oder einem Ausführbaren Programm arbeiten. Erst bei der Verarbeitung des Programms bekommen die Einzelzeichen eine Bedeutung und bekommt eine Struktur.

Nun wollen wir zu Beginn erstmal eine Textdatei zu öffnen. Diese würde etwa so aussehen...

FILE *datei;
datei = fopen("textdatei.txt", "r");

Hier öffnen wir nun die Textdatei "textdatei.txt" auf die nun unser FILE-Zeiger datei zeigt und verbinden damit einen Stream. Als String ist jeder zulässige Pfadname erlaubt. Also auch auch Laufwerksangaben (sollten sie unter MS-DOS programmieren) Das Argument "r" steht für den Modus, wie auf diesen Stream zugegriffen werden soll. In unserem Beispiel steht "r" für read, also lesen.

Der FILE-Zeiger, oder man spricht auch vom FILE-Stream, ist eine Struktur, die in der Headerdatei stdio.h vordefiniert ist. Dieser beinhaltet alle Informationen die wir für die höheren Datei I/O benötigen. Beispielsweise...

  • Puffer : Anfangsadresse, aktueller Zeiger, Größe
  • Filedeskriptor (darauf kommen wir noch in der niedrigeren Ebene zu sprechen)
  • Position von Schreib-und/oder-Lesezeiger
  • Fehler-und-EOF-Flags


Damit ist es auch möglich mehrere Dateien in einem Stream zu öffnen.....

FILE *datei,*datei2;
datei = fopen("textdatei.txt","r");
datei2= fopen("textdat2.txt","r");

Somit haben sie intern 2 Dateien zum lesen geöffnet. Schauen wir unser 1.Beispiel an...

/*Download:fopen1.c*/
#include <stdio.h> int main() { FILE *datei; datei=fopen("test.txt","r"); if(datei==NULL) { printf("Konnte Datei \"test.txt\" nicht öffnen!\n"); } return 0; }

Dies Programm öffnet falls vorhanden die Datei "test.txt". Falls die Datei nicht geöffnet werden konnte bzw. nicht vorhanden ist liefert fopen den NULL-Zeiger zurück. In diesem Beispiel muss die die Datei test.txt übrigens im selben Verzeichnis sein wie der Quellcode unseres Programms. Nehmen wir mal an die Datei test.txt liegt im Verzeichnis...

c:\Dokumentationen\Texte\test.txt

...dann müssen sie bei unserem Programm den ersten Parameter wie folgt schreiben...

datei = fopen("c:\\Dokumentationen\\Texte\\test.txt","r");

Bitte beachten sie das sie bei MS-Dos/Windows anstatt einem '\' zwei '\\' schreiben müssen um das Zeichen '\' anzuzeigen.

Bei Linux geben sie falls ihre Datei im Verzeichnis...

/home/Texte/test.txt

...steht folgendes in das Programm ein...

datei = fopen ("/home/Texte/test.txt","r");

Wie sie wissen gibt es unter Linux keine Laufwerksbezeichnungen da letztendlich jedes Gerät ob Festplatte, CD-Rom oder Diskette als Datei betrachtet werden kann. Hierzu nun die Gegenüberstellung der Unterschiedlichen Schreibweise zwischen Linux und MS-DOS....

Eigenschaften MS-DOS Linux
Erlaubte Zeichen Buchstaben, Zahlen und einige Sonderzeichen alle Zeichen
Zeichenlänge 8 Zeichen plus 3 für die Namenserweiterung wie *.exe,*.txt... 255
Unterscheidung Groß- und Kleinschreibung nur Großschrift Ja
Pfadbezeichnung Trennzeichen '\' Trennzeichen '/'
Laufwerksbezeichnung a:, b:, c:,....z: keine


Nun gibt es außer den Lesezugriffe den wir mittels "r" festgelegt haben natürlich andere Bearbeitungsmodi. Hier ein weitere Tabelle der vorhandenen Modi....

Modus Bedeutung
r Öffnen einer Datei zum lesen. Wenn Datei nicht existiert oder nicht geöffnet werden konnte gibt fopen NULL zurück.
w Anlegen einer Datei zum ändern. Wenn Datei nicht geändert werden kann bzw. wenn keine Schreibberechtigung besteht liefert auch hier fopen NULL zurück. Wenn unter MS-Dos die Datei ein Readonly-Attribut hat kann sie nicht geöffnet werden.
a Öffnet Datei zum Schreiben oder Anhängen(attachment) ans Ende der Datei. Wenn nicht vorhanden gibt fopen wieder NULL zurück. Auch NULL wird zurückgeliefert wenn keine Zugriffsrechte.
r+ Öffnet Datei zum Lesen und Schreiben, also zum verändern. Bei Fehler oder mangelnde Rechte liefert fopen auch hier NULL zurück.
w+ Anlegen einer Datei zum ändern. Existiert ein Datei mit gleichem Namen wird diese zuvor gelöscht. Bei Fehler oder mangelnde Rechte liefert fopen auch hier NULL zurück.
a+ Öffnen einer Datei zum Lesen oder Schreiben am Ende der Datei bzw. die Datei wird angelegt falls noch nicht vorhanden. Bei Fehler oder mangelnde Rechte liefert fopen auch hier NULL zurück.


Dann gibt es noch 2 weitere Modi die zwischen Text und Binärdatei unterscheiden können....

Modus Bedeutung
b Die Datei wird im Binärmodus geöffnet. Die Zeichen werden dabei nicht verändert bzw. Konvertiert. Das heißt jedes Zeichen wird so weitergegeben wie es in der Datei steht und es wird ebenso in die Datei geschrieben wie die Schreibfunktion eingestellt ist. Der Modus 'b' wird bei Linux nichtverwendet und wird bei Angabe ignoriert. Dieser wird nur aus Kompatibilitätsgründen zu ANSI-C erhalten.
t Die Datei wird im Textmodus geöffnet und sollte daher auch lesbare Textzeichen beinhalten.


Jetzt noch zur Erklärung des Unterschiedes zwischen Textdateien und Binärdateien....

Nun Textdateien dienen dazu das sie für den Mensch lesbar sind mit z.B. einem Editor. Binärdateien bzw. binäre Zeichen (0,1) ist die Sprache die der Computer versteht. Denn was sie z.B. als....

Hallo

...lesen ließt ihr PC Dasselbe folgendermaßen....

01001000 01100001 01101100 01101100 01101111

Für einem Menschen ist dies kaum lesbar. Daher bestehen Textdateien immer aus sichtbaren ASCII - Zeichen und ein paar Steuercodes wie z.B. Zeilenschaltung oder Tabulatoren. Für Bearbeitung reiner Textdateien ist der Modus t gedacht. Da bei MS-DOS ein Zeilenende mit der Sequenz \r\n angezeigt wird und bei Linux nur ein einzelnes \n führen Compiler für MS-Dos/Win im Textmodus t folgende Konvertierung durch.....

  1. Beim Schreiben in eine Textdatei wird ein \n automatisch in ein \r\n konvertiert.
  2. Beim Lesen einer Textdatei wird ein \r\n in ein einzelnes \n konvertiert.
  3. Beim Lesen einer Textdatei wird die Tastenkombination <STRG

In Binärmodus wird diese Konvertierung nicht vorgenommen und sie sind abhängig von der Systemeinstellung.

Bei Linux ist das 'b' wie in der Tabelle oben schon erwähnt Nichtsbedeutend.

Den Namen der zu öffnenden Datei können sie natürlich auch mit Hilfe von Argumenten in der Kommandozeile auswerten. Hier ein Beispiel dazu......

/*Download:fopen2.c*/
#include <stdio.h> int main(int argc, char **argv) { FILE *datei; if(argc < 2) { printf("Verwendung : %s FILE\n",*argv); exit(0); } datei = fopen(argv[1], "r"); if(datei != NULL) printf("Datei erfolgreich geöffnet\n"); else perror("Fehler beim öffnen der Datei"); return 0; }

Hier überprüfen wir ob 2 Argumente in der Kommandozeile eingegeben wurden und geben bei Fehler eine entsprechende Meldung aus. Mit perror wird ausgegeben, warum ein von uns in der Kommandozeile eingegebene Datei nicht erfolgreich geöffnet werden konnte. Wir kommen noch dazu. Meist dürfte der Fehler an einer falschen Pfadangabe oder unzureichende Rechten einer Datei liegen.

Wenn sie mit dem modus "w" unter Linux eine Datei erzeugen, wird diese Standardmäßig mit den Zugriffsrechten 0666 (-rw-rw-rw-) ausgestattet.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf