16.8 Datei (Stream) schließen – »fclose()« 

Die Funktion fclose() schließt eine Datei (Stream), die zuvor mit fopen() geöffnet wurde. Was soll das bringen? Wenn sich ein Programm beendet, schließen sich automatisch alle noch offenen Streams. Es gibt zwei gute Gründe, dies dennoch selbst zu tun:
- Die Anzahl der geöffneten Dateien ist begrenzt. Sie ist in der Konstante FOPEN_MAX in der Headerdatei <stdio.h> deklariert. Wird versucht, FOPEN_MAX+1 Dateien zu öffnen, dann schlägt dies fehl. Mit fclose() kann wieder ein FILE-Zeiger freigegeben werden.
- Wenn eine Datei im Schreibmodus geöffnet wurde, wird diese erst beschrieben, wenn der Puffer voll ist. Ist der Puffer nur teilweise voll und das Programm beendet sich mit einem Fehler, dann sind die Daten im Puffer verloren.
Die Syntax von fclose() ist:
#include <stdio.h> int fclose(FILE *f);
Hiermit wird der Stream geschlossen, und f vom Typ FILE ist wieder für weitere Verwendungen freigegeben.
Hierzu ein kleines Listing:
/* fclose.c */ #include <stdio.h> #include <stdlib.h> int main(void) { FILE *quell,*ziel; char quellname[20],zielname[20]; int c, wahl; printf("Bitte geben Sie den Namen der Zieldatei an : "); scanf("%19s",zielname); if( (ziel=fopen(zielname,"a+")) == NULL) { printf("Konnte \"%s\" nicht erstellen bzw. finden!\n", zielname); printf("...oder Sie haben unzureichende Rechte \n"); return EXIT_FAILURE; } do { printf("Welche Datei wollen Sie in " "die Zieldatei schreiben,\n"); printf("bzw. anhängen (name.xxx) : "); scanf("%19s",quellname); quell= fopen(quellname,"r"); if(NULL == quell) { printf("Konnte %s nicht öffnen!\n",quellname); return EXIT_FAILURE; } else { while((c=getc(quell)) != EOF) putc(c,ziel); fclose(quell); } printf("Weitere Datei an %s anhängen (1=ja/2=nein): ", zielname); scanf("%1d",&wahl); } while(wahl == 1); return EXIT_SUCCESS; }
Zuerst wird eine Datei geöffnet oder – falls noch nicht vorhanden – neu erstellt. Diese Datei wird im Modus "a+" geöffnet, womit die schreibenden Daten immer an das Ende der Datei angehängt werden. Anschließend werden in der do while-Schleife Dateien zum Lesen mit dem Modus "r" geöffnet, um den Inhalt immer an das Ende der Zieldatei zu hängen. Danach wird diese Datei wieder geschlossen:
fclose(quell);
Damit ist der Zeiger quell wieder frei zum Öffnen einer anderen Datei. Jetzt kann erneut eine Datei geöffnet werden, um diese wieder an das Ende der Zieldatei zu hängen. Der Modus "a+" eignet sich prima zum Erstellen einer Logdatei oder etwa um zu kontrollieren, was die Mitarbeiter so alles mit und an dem PC treiben.
Das Programm soll wieder ein wenig flexibler gemacht werden. Wird z. B.
programm alles.txt name1.txt name2.txt home/C1/adressen.txt
eingegeben, werden die Dateien mit den Namen name1.txt, name2.txt und die Datei im Verzeichnis /home/C1/adressen.txt in einer neu erstellten Datei, hier alles.txt, angehängt. Das Schema das Aufrufs lautet also:
<Programmname><Ziel><Quelle1><Quelle2><Quelle_n>
Die Verwendung von zwei Streams (FILE *quelle,*ziel) in Verbindung mit der Funktion fclose() wird im folgenden Beispiel dargestellt.
/* file_cat.c */ #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { FILE *quell,*ziel; char c; int i; if(argc < 3) { printf("Fehler!!!!\n"); printf("Mindestens 3 Argumente angeben :\n"); printf("<Programmname><Ziel><Quelle1>" "(<Quelle2><Quelle_n>) \n"); return EXIT_FAILURE; } ziel = fopen(argv[1], "a+"); if(ziel == NULL) { printf("Konnte \"%s\" nicht erstellen bzw. nicht" " finden!\n", argv[1]); return EXIT_FAILURE; } for(i = 2; i < argc; i++) { if(argv[i] != NULL) { quell = fopen(argv[i], "r"); if(NULL == quell) { printf("Konnte %s nicht öffnen\n", argv[i]); return EXIT_FAILURE; } else { while((c=getc(quell)) != EOF) putc(c,ziel); fclose(quell); } } } fclose(ziel); return EXIT_SUCCESS; }
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.