ein Kapitel zurück                                           ein Kapitel weiter

fclose schließt wie der Name schon sagt eine Datei die zuvor mit fopen geöffnet haben. Was soll das bringen werden sie sich fragen? Denn wenn sie ein Programm beenden schließen doch automatisch alle Dateien. Nun eigentlich gibt es nur 2 Gründe eine Datei zu schließen:

  • Sie können nicht unendlich viele Dateien gleichzeitig öffnen. Die Anzahl der Dateien ist auch begrenzt. Ich bin mir nicht sicher aber ich glaube es sind 25 Dateien. Also 25 Dateien vom Typ FILE* die sie öffnen können. Wenn sie jetzt eine 26. Datei öffnen wollen wird dies nicht mehr funktionieren. Mit fclose() können sie wieder einen FILE - Zeiger freigeben.
  • Wenn sie in eine Datei schreiben, wird erst immer in die Datei geschrieben wenn der Puffer voll ist (Außer sie stellen die Pufferung auf Zeichenweise ein aber dazu später mehr). Wenn jetzt der Puffer bei einer Datei nur teilweise voll und das Programm plötzlich mit einem Fehler abgebrochen oder beendet werden, gehen die Daten die im Puffer sind verloren.


Jetzt noch kurz die Verwendung von fclose. Der Syntax...

fclose(FILE *f);

Hiermit würden wir die Datei auf die f zeigt schließen und der Zeiger f vom Typ FILE wäre wieder frei zum öffnen anderer Dateien.

Natürlich will ich Ihnen dazu ein kleines Beispiel nicht vorenthalten. Wir öffnen solange Dateien und hängen diese immer an eine von uns neue erstellte Datei an.

/*Download:fclose1.c*/
#include <stdio.h> #include <stdlib.h> //exit #include <ctype.h> //tolower int main() { FILE *quell,*ziel; char quellname[20],zielname[20]; char c,jn; printf("Bitte geben sie den Namen der Zieldatei an : "); scanf("%s",zielname); if((ziel=fopen(zielname,"a+"))==NULL) { printf("Konnte \"%s\" nicht erstellen bzw finden!\n"); printf("...oder sie unzureichende Rechte \n"); exit(0); } do { printf("Welche Datei wollen sie in die Zieldatein schreiben,\n"); printf("bzw. anhängen (name.xxx) : "); scanf("%s",quellname); if((quell=fopen(quellname,"r"))== NULL) printf("Konnte %s nicht öffnen!\n",quellname); else { while((c=getc(quell)) != EOF) putc(c,ziel); } fflush(stdin); printf("Weiter Datei an %s anhängen (j/n): ",zielname); tolower(scanf("%c",&jn)); fclose(quell); }while(jn=='j'); return 0; }

Viel neues zeigt ihnen das Programm ja nicht. Zuerst öffnen bzw. falls nicht vorhanden erstellen wir eine neue Datei mit dem Namen z.b. "test.txt". Falls die Datei schon vorhanden ist wird diese nicht überschrieben sondern nur geöffnet und ist bereit Daten ans Ende der Datei zu hängen da wir die Datei ja im Modus "a+" öffnen. Anschließend öffnen wir in der do-while Schleife solange Dateien zum lesen mit dem Modus "r" und hängen diese Datei ans Ende unsere zuvor erstellten Zieldatei. Solange bis sie die Abfrage ja oder nein mit n beenden. Ob sie nun 'n' oder 'N' eingeben ist egal da mittels tolower(..) unser char - Zeichen in ein Kleinbuchstaben umgewandelt wird. Anschließend schließen wir die Datei mittels...

fclose(quell);

Somit ist unsere Zeiger quell wieder frei zum öffnen einer anderen Datei. Und wir können weitere Dateien öffnen und diese ans Ende unsere Zieldatei anhängen. Sie sehen der Modus "a+" eignet sich prima zum erstellen einer Logdatei wie dies z.B. bei Dateien mit der Endung *.log geschieht. Oder zum kontrollieren was ihre Mitarbeiter so alles mit und an dem PC treiben ;)

Wollen wir unser Programm so umschreiben das durch....

zusammen alles.txt name1.txt name2.txt /home/own/adressen.txt

z.B. die Dateien name1.txt, name2.txt und die Datei im Verzeichnis /home/own/adressen.txt alle in einer neuerstellten Datei hier z.B. alles.txt angehängt werden. Genauer...

<Programmname

Wir wollen aber dazu nur 2 Zeiger vom Type FILE (FILE *quelle,*ziel) verwenden. Dies können wir mittels fclose bewerkstelligen.......

/*Download:fclose2.c*/
#include <stdio.h> #include <stdlib.h> int main(int argc,int *argv[]) { FILE *quell,*ziel; char c,i; if(argc<3) { printf("Fehler!!!!\n"); printf("Es müssen mindestens 3 Argumente übergeben werde:\n"); printf("<Programmname><Ziel><Quelle>(<Quelle2><Quelle3>...)\n"); exit(0); } if((ziel=fopen(argv[1],"a+"))==NULL) { printf("Konnte \"%s\" nicht erstellen bzw finden!\n"); exit(1); } for(i=1;i<argc;i++) { if((quell=fopen(argv[i],"r"))== NULL) printf("Konnte %s nicht öffnen\n",argv[i]); else while((c=getc(quell)) != EOF) putc(c,ziel); fclose(quell); } return 0; }

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf