Schreiben und lesen von Dateien

Letztes Update 2020/10/07 12:11

Öffnen einer Datei

An der Konsole starten wir den Editor Nano:

nano datei_r.c

Hier geben wir folgendes ein:

/* datei_r.c öffnen einer Datei */ #include <stdio.h> int main() { FILE *fp; // Zeiger auf die Datei fp = fopen("test.txt", "r"); // Datei öffnen if(fp == NULL) { printf ("Datei kann nicht geöffnet werden!\n"); } else { printf ("Datei vorhanden und konnte geöffnet werden!\n"); fclose (fp); // Datei wieder schließen } return 0; }

mit Strg+o den Text speichern und mit Strg+x den Editor verlassen.

Das Programm Compilieren

gcc -o datei_r datei_r.c

Mit der Ausführung des Programms wird versucht, eine Datei mit dem Namen test.txt zu öffnen. Falls diese nicht vorhanden ist, wird die Fehlermeldung Datei kann nicht geöffnet werden! ausgegeben, ansonsten Datei vorhanden und konnte geöffnet werden!.

an der Konsole geben wir ein:

pi@server:~/c_kurs $ ./datei_r
Datei kann nicht geöffnet werden!
pi@server:~/c_kurs $

Die Datei ist nicht vorhanden, daher die Fehlermeldung. Wir legen mit

pi@server:~/c_kurs $ touch test.txt

eine Datei mit dem Namen test.txt an und starten das Programm neu:

pi@server:~/c_kurs $ ./datei_r
Datei vorhanden und konnte geöffnet werden!
pi@server:~/c_kurs $

Nachdem die Datei angelegt wurde, wird der Fund mit einer positiven Meldung bestätigt.

Die neuen Funktionen im Listing

FILE *fp; fopen("test.txt", "r"); fclose (fp);

FILE *fp
Der Filepointer fp ist der Zeiger auf die Datei, daher *fp und ist in der stdio.h definiert.

fopen("name", mode)
Mit fopen wird eine Datei geöffnet. name bezeichnet die Datei als String, mode bezeichnet die Zugriffsart, "r" für Lesezugriff, "w" für Schreibzugriff, "a" für anfügenden Schreibzugriff, "b" für Binärmodus und "t" für Textmodus.

fclose (fp)
Damit wird die geöffnete Datei geschlossen. Eine vom Programm geöffnete Datei wird beim Programmende oder bei einem Programmabbruch automatisch geschlossen. Bei Schreibzugriff werden die im Puffer befindlichen Daten noch gespeichert.

Schreiben in eine Datei

An der Konsole starten wir den Editor Nano:

nano fibo.c

Hier geben wir folgendes ein:

/* fibo.c Die ersten 10 Zahlen der Fibonacci-Folge berechnen und in der Datei "fibonacci.dat" speichern und am Bildschirm ausgeben. */ #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { FILE *fp; fp = fopen("fibonacci.dat", "w"); int i; int fibo[10]; fibo[0] = 1; fibo[1] = 1; for (i=2; i<=9; i++){ fibo[i] = fibo[i-1] + fibo[i-2]; //printf("%d\n", fibo[i]); } for (i=0; i<=9; i++){ printf("%d\n", fibo[i]); fprintf(fp, "%d\n", fibo[i]); } fclose(fp); return 0; }

Mit Strg+o den Text speichern und mit Strg+x den Editor verlassen.

Das Programm Compilieren

gcc -o fibo fibo.c -lm

Hier wieder der Schalter -lm wegen der <math.h> Funktion.

Mit der Ausführung des Programms werden die ersten zehn Zahlen der Fibonacci-Folge errechnet, in eine Datei mit dem Namen fibonacci.dat geschrieben und am Bildschirm ausgegeben.

an der Konsole geben wir ein:

./fibo

Im selben Verzeichnis wird nun die Datei mit dem Namen fibonacci.dat erstellt. Zur Kontrolle geben wir an der Konsole

pi@server:~/c_kurs $ cat fibonacci.dat

ein. Es wird nun der Inhalt der Datei ausgegeben:

1
1
2
3
5
8
13
21
34
55
pi@server:~/c_kurs $

Die neuen Funktionen im Listing

fprintf(), int fibo[10];

fprintf()
Vergleichbar mit dem fprint Kommando zur Ausgabe auf den Bildschirm. fprintf benötigt einen Parameter mehr, die Datei, die ihm als Zeiger mitgegeben wird: fprintf(fp, „%d“, var).

int var[n]
Ein Array ist ein Datentyp, in den man mehrere Werte ablegen kann. In diesem Fall eindimensional. Zum leichteren Verständnis kann der Vergleich mit einer Pillendose hergenommen werden. Für jeden Tag der Woche eine Abteilung in der Dose. Wäre bei einer Arraydefinition var[6]. deswegen sechs, da bei null zu zählen begonnen wird. Arrays können auch mehrdimensional sein. Um wieder die Pillendose herzunehmen: für sieben Tage die Woche je drei Medikamente. Die Definition wäre hier var[6, 2].

Zeilenweises Lesen einer Datei

An der Konsole starten wir den Editor Nano:

nano readata.c

Hier geben wir folgendes ein:

/* readata.c Die Daten aus der Datei "fibonacci.dat" lesen und am Bildschirm ausgeben */ #include <stdio.h> #include <stdlib.h> int main() { FILE *fp; int i, data, x; fp = fopen("fibonacci.dat", "r"); if(fp == NULL) { printf("Datei nicht vorhanden oder kann nicht geöffnet werden.\n"); return EXIT_FAILURE; } else { while (!feof(fp)){ fscanf(fp, "%d", &x); printf("%d\n", x); } } fclose(fp); return EXIT_SUCCESS; }

Das Programm Compilieren

gcc -o readata readata.c

Mit der Ausführung des Programms wird versucht, die Datei mit dem Namen fibonacci.dat zu öffnen. Falls diese nicht vorhanden ist, wird die Fehlermeldung Datei nicht vorhanden oder kann nicht geöffnet werden. ausgegeben, ansonsten werden die Werte aus der Datei Zeilenweise eingelesen und am Bildschilm ausgegeben.

an der Konsole geben wir ein:

pi@server:~/c_kurs $ ./readata
1
1
2
3
5
8
13
21
34
55
55
pi@server:~/c_kurs $

Die neuen Funktionen im Listing

fopen("name", "r")
Wie die oben beschriebene Funktion, aber im Lesemodus "r".

while()
Mit der while Schleife wird der Anweisungsblock zwischen den geschwungenen Klammern {…} ausgeführt, bis die Bedingung erfüllt ist.

feof()
Mit der Funktion feof() können Sie einen Stream daraufhin testen, ob das EOF-Flag gesetzt ist oder nicht. Hier wird die while Schleife solange abgearbeitet, bis keine Daten zum einlesen mehr vorhanden sind (!feof(fp)).

return EXIT_FAILURE und return EXIT_SUCCESS
Gibt einen Rückgabewert beim Beenden des Programms. Falls das Programm richtig abgearbeitet wird(EXIT_SUCCESS), dann ist der Rückgabewert 0. Beim Auftreten von einem Fehler (EXIT_FAILURE) ist der Wert ungleich 0. Die beiden Makros sind in der Headerdatei <stdlib.h> definiert.

Zufügen von Daten in eine Datei

An der Konsole starten wir den Editor Nano:

nano addata.c

Hier geben wir folgendes ein:

/** addata.c * * Eintragen des aktuellen Datums und der Uhrzeit in die * Datei "fibonacci.dat" im selben Verzeichnis. * Weiters einige Beispiele zur Zeitfunktionen * */ #include <stdio.h> #include <stdlib.h> #include <time.h> struct tm *tmnow; int main() { time_t tnow; time(&tnow); tmnow = localtime(&tnow); time_t now; now = time(0); FILE *fp; fp = fopen("fibonacci.dat", "a"); if(fp == NULL) { printf("Datei nicht vorhanden oder kann nicht geöffnet werden.\n"); return EXIT_FAILURE; } else { printf("%d.%d.%d\n", tmnow->tm_mday, tmnow->tm_mon + 1, tmnow->tm_year + 1900); printf("%s\n", ctime(&now)); fprintf(fp,"%s\n", ctime(&now)); // Diese Zeile wird in die Datei eingetragen. } return 0; fclose(fp); }

Das Programm Compilieren

gcc -o addata addata.c

Mit der Ausführung des Programms wird in die bestehende Datei fibonacci.dat das aktuelle Datum eingetragen. Auf eine Fehlermeldung wurde hier verzichtet, da die Datei angelegt wird, falls sie nicht vorhanden ist.

An der Konsole geben wir ein:

pi@server:~/c_kurs $ ./addata