Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 18 Ein-/Ausgabe-Funktionen
  gp 18.1 Was ist eine Datei?
  gp 18.2 Formatierte und unformatierte Ein-/Ausgabe
  gp 18.3 Streams
  gp 18.4 Höhere Ein-/Ausgabe-Funktionen
  gp 18.5 Datei (Stream) öffnen – fopen
    gp 18.5.1 Modus für fopen()
    gp 18.5.2 Maximale Anzahl geöffneter Dateien – FOPEN_MAX
  gp 18.6 Zeichenweise Lesen und Schreiben – getchar und putchar
    gp 18.6.1 Ein etwas portableres getch()
  gp 18.7 Zeichenweise Lesen und Schreiben – putc/fputc und getc/fgetc
  gp 18.8 Datei (Stream) schließen – fclose
  gp 18.9 Formatiertes Einlesen/Ausgeben von Streams mit fprintf und fscanf
  gp 18.10 Standard-Streams in C
    gp 18.10.1 Standard-Streams umleiten
  gp 18.11 Fehlerbehandlung von Streams – feof, ferror und clearerr
  gp 18.12 Gelesenes Zeichen in die Eingabe zurück-schieben – ungetc
  gp 18.13 (Tastatur-)Puffer leeren – fflush
    gp 18.13.1 Pufferung
  gp 18.14 Stream positionieren – fseek, rewind und ftell
  gp 18.15 Stream positionieren – fsetpos, fgetpos
  gp 18.16 Zeilenweise Ein-/Ausgabe von Streams
    gp 18.16.1 Zeilenweise Lesen mit gets/fgets
    gp 18.16.2 Zeilenweise Schreiben mit puts/fputs
    gp 18.16.3 Zeilenweise Einlesen vom Stream mit getline() (nicht ANSI C)
    gp 18.16.4 Rezepte für zeilenweises Einlesen und Ausgeben
  gp 18.17 Blockweise Lesen und Schreiben – fread und fwrite
    gp 18.17.1 Blockweises Lesen – fread()
    gp 18.17.2 Blockweises Schreiben – fwrite()
    gp 18.17.3 Big-Endian und Little-Endian
  gp 18.18 Datei (Stream) erneut öffnen – freopen
  gp 18.19 Datei löschen oder umbenennen – remove und rename
    gp 18.19.1 remove()
    gp 18.19.2 rename()
  gp 18.20 Pufferung einstellen – setbuf und setvbuf
  gp 18.21 Temporäre Dateien erzeugen – tmpfile und tmpnam
    gp 18.21.1 mkstemp() – Sichere Alternative für Linux/UNIX (nicht ANSI C)
  gp 18.22 Fehlerausgabe mit strerror und perror
  gp 18.23 Formatiert in einem String schreiben und formatiert aus einem String lesen – sscanf und sprintf
  gp 18.24 Fortgeschrittenes Thema
  gp 18.25 Low-Level-Datei-I/O-Funktionen (nicht ANSI C)
  gp 18.26 Datei öffnen – open
  gp 18.27 Datei schließen – close
  gp 18.28 Datei erzeugen – creat
  gp 18.29 Schreiben und Lesen – write und read
  gp 18.30 File-Deskriptor positionieren – lseek
  gp 18.31 File-Deskriptor von einem Stream – fileno
  gp 18.32 Stream von File-Deskriptor – fdopen


Galileo Computing - Zum Seitenanfang

18.8 Datei (Stream) schließen – fclose  toptop

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:

gp  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.
gp  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, sind die Daten im Puffer verloren.

Die Syntax von fclose():

#include <stdio.h>
int fclose(FILE *f);

Hiermit wird der Stream geschlossen, und f vom Typ FILE ist wieder freigegeben für weitere Verwendungen.

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 ans Ende der Zieldatei zu hängen. Der Modus "a+" eignet sich prima zum Erstellen einer Logdatei. Oder etwa zum Kontrollieren, was die Mitarbeiter so alles mit und an dem PC treiben.

Das Programm soll wieder ein wenig flexibler gemacht werden. Wird z.B. Folgendes eingegeben

programm alles.txt name1.txt name2.txt home/C1/adressen.txt

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

<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,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;
}
 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de