Willkommen beim sechsten Teil des C-Kurses!

Bisher hatten wir, recht erfolgreich, schon kleinere Programme geschrieben, die schon recht ansehnlich waren. Doch sie hatten ein Manko: Die eingegebenen Daten waren nach dem Beenden der Programme im Nirvana gelandet. Dem wollen wir abhelfen, indem wir uns im 6. Teil mit der Erstellung von Daten auf der Festplatte befassen.
 
 
Das Öffnen und Schließen einer Datei

Für C ist eine Datei nichts anderes als eine Ansammlung von Zeichen, unabhängig, was drin steht. Um mit einer Datei unter C zu arbeiten, muß man sie "öffnen".
 

    /*
      Mal schauen, was man mit Files alles anstellen kann 
    */
    #include <stdio.h>

     
    void main ( void )
    {
      /*
      neuer Variablentyp FILE ! Er enthält Informationen über das zu bearbeitende File! 
      */

       
      FILE *datei; 

       
      datei = fopen ( "test.dat" , "r" );
      if (datei == NULL ) 
      {
        /*
          Da ist wohl ein Fehler aufgetreten! 
        */

         
        printf ("\nDie Datei konnte nicht geöffnet werden!\n");
      }
      else 
      {
        /* 
          Alles lief wie geplant - es kann losgehen 
        */

         
        printf ("\nAlles OK!\n");
        printf ("\t\t...und die Datei ist wieder zu\n");

         
        fclose (datei);
    }

 
 
 
 
fopen

Mittels fopen wird eine Datei geöffnet. Als Argument werden die zu bearbeitende Datei und der Arbeitsmodus übergeben.
 

r
Öffnen der Datei zum Lesen ( r = read ) 

Rückgabe ist NULL wenn die Datei nicht existiert, oder keine Leserechte bestehen.

w
Öffnen der Datei zum Schreiben ( w = write ) 

Rückgabewert ist NULL wenn die Datei READ-ONLY ist, oder nicht existiert.

a
Öffnen der Datei zum anhängen ans Ende ( a = append ) Wenn die Datei existiert, wird das geschriebene ans Ende gehängt. Wenn die Datei nicht existiert, wird sie angelegt. 

Rückgabewert ist NULL, wenn keine Datei erstellt werden darf oder die Datei nicht beschrieben werden darf.

r+
Die Datei wird zum Öffnen und Schreiben geöffnet. 

Rückgabewert ist NULL, wenn die Datei nicht existiert, oder keine Lese- und Schreibrechte für die Datei existieren.

w+
Anlegen einer neuen Datei. Existiert die Datei schon, so wird sie gelöscht! 

Rückgabewert ist NULL, wenn die der Ersteller keine Rechte für diese Aktionen hat.

a+
Öffnen einer Datei zum Lesen oder zum Schreiben (anhängen) am Ende. Die Datei wird erstellt, falls sie nicht existiert. 

Rückgabewert ist NULL, wenn eine Datei nicht gelesen oder beschrieben werden darf, bzw. wenn die Dateirechte nicht ausreichend sind.

Es sind folgende Zusätze erlaubt:
 

t Die Datei wird im Textmodus geöffnet und Konvertierungen werden vorgenommen. Dies ist der Defaultmodus und braucht in der Regel nicht angegeben werden.
b Die Datei wird im Binärmodus geöffnet. Es werden keine Konvertierungen vorgenommen!

Beispiel:
 

ab
Für die Datei gilt der Arbeitsmodus "a". 

Datei wird im Binärmodus geöffnet.

wt
Für die Datei gilt der Arbeitsmodus "w". 

Die Datei wird im Textmodus geöffnet.


 
 
 
fclose

Mit fclose können wir die Dateien, die wir mit fopen öffneten wieder schließen.
 

fclose (datei);

Hier werden die Schreibpuffer auf das Medium zurückgeschrieben und die Verzeichniseinträge aktualisiert.

datei ist vom Typ *FILE und wurde mit fopen initialisiert!

... und was man sonst damit machen kann

Was tun, sprach Zeus..... Das File ist geöffnet und weiter ? Files auf und zu machen ist auf die Dauer recht Fade! Etwas wie printf oder scanf müßte es geben. Und in der Tat....

In den folgenden Beispielen ist datei immer eine mittels fopen erzeugte Variable vom Typ *FILE! (Zeiger auf den Typ FILE)
 
 
 
Lesen und schreiben in Files
fscanf

Der Befehl verhält sich genau wie scanf - mit nur einem Unterschied, hier wird angegeben woher die Information kommen soll.
 

fscanf ( datei , "%c",  &zeichen);

Der Befehl ist also Vergleichbar mit einem
 

scanf ( "%c",  &zeichen );

Der einzige Unterschied: Hier wird von einer Datei gelesen. Die Variable zeichen ist vom Typ char.
 
 
 
 
fprintf

Und hier kann man ahnen was folgt.....
 

fprintf ( datei , "\nHallo - Das File ist geöffnet :-)\n\n");

Wie oben ist er equivalent mit der Bildschirmausgabe
 

printf ( "\nHallo - Das File ist geöffnet :-)\n\n" );

Nur, das wieder in das File geschrieben wird.
 
 
 
 
Standardkanäle in C

Kanäle ? Ich kenn nur Canale Grande.... C legt bei jedem Start eines Programms drei fest definierte Ein- & Ausgabekanäle an. Sie müssen nicht definiert werden! In der Regel werden diese Ein-, Ausgabekanäle sehr selten benutzt.
 
 
 
 
stdin

Der Standardeingabekanal Normalerweise die Tastatur
 

scanf ( ... )

ist identisch mit
 

fscanf ( stdin, ... )

 
 
 
stdout

Der Standardausgabekanal Normalerweise der Bildschirm
 

printf ( ... )

ist identisch mit
 

fprintf ( stdout , ... )

 
 
 
stderr

Der Standardfehlerkanal Normalerweise werden die hier Übertragenen Fehlermeldungen auch auf dem Bildschirm mit ausgegeben und sind zu Diagnosezwecken sinnvoll. Von praktischem Nutzen wird das ganze, wenn der Standardausgabekanal nicht mehr der Bildschirm ist und man trotzdem Feedback haben möchte.
 
 
 
 
Beispielprogramm

So, jetzt können wir schon eine ganze Menge anfangen. Das untere Programm einfach mal ausprobieren und sich das erzeugte File anschauen. Testen Sie den Unterschied zwischen Text- und Binärmodus!
 

#include <stdio.h>

void main ( void

{

    FILE *datei;

    datei = fopen ( "test.dat" , "w+" );

    if (datei == NULL ) 

    {

      printf ("\nDie Datei konnte nicht geöffnet werden!\n");
    }

    else

    {

      printf ("\nAlles OK!\nIch schreibe in die Datei\n");

      fprintf (datei, "\nUnsere erste Datei :-)\n\n"); 

      fprintf (datei, "Wenn das so weiter geht ist unser Freund Bill arbeitslos\n");

      printf ("\n...und die Datei ist wieder zu\n"); 

      fclose (datei); 

    }
}

Das ist unser erster Ausflug zu den Dateioperationen. Im nächsten Teil werden wir uns mit Datenstrukturen befassen.

Und wer wissen will, wo das ganze hinausläuft : Wir werden unsere eigene Datenbank schreiben!
 
 
 
 
Hausaufgaben

Aber vor den Erfolg hat Gott die Aufgaben des PCD´s gesetzt, die da wären:

1) Schreiben sie ein kleines Programm, welches 5 Zeilen vom Bildschirm einliest und in eine Datei schreibt.

2) Spielen sie ein bischen mit den Operationsmodi für die Dateien herum. Nichts geht über Praxis!
 
 
 
 
 
...das Obligatorische

Autor: Sebastian Cyris \ PCD Bascht

Dieser C-Kurs dient nur zu Lehrzwecken! Eine Vervielfältigung ist ohne vorherige Absprache mit dem Autor verboten! Die verwendete Software unterliegt der GPL und unterliegt der Software beiliegenden Bestimmungen zu deren Nutzung! Jede weitere Lizenzbestimmung die der benutzten Software beiliegt, ist zu beachten!