14.12    Kontrollfragen und Aufgaben

  1. Was sind Streams?

  2. Welche Funktionen kennen Sie, um eine Datei zu öffnen?

  3. Im folgenden Codeausschnitt soll die Datei datei.txt zeichenweise in die Datei kopie.txt kopiert werden. Allerdings sind nach diesem Vorgang beide Dateien leer. Was wurde falsch gemacht?

    01  #define FILENAME1 "datei.txt"
    02 #define FILENAME2 "kopie.txt"
    ...
    03 FILE *fpr, *fpw;
    04 int c;
    05 fpr = fopen( FILENAME1, "w" );
    06 fpw = fopen( FILENAME2, "a+" );
    ...
    07 while ( (c=fgetc(fpr)) != EOF ) {
    08 fputc(c, fpw );
    09 }
    ...
  4. Im folgenden Beispiel soll in einer Schleife eine Art Berechnung simuliert werden. Hierbei wird keine echte Berechnung durchgeführt. In Zeile (10) basteln Sie den Dateinamen mithilfe der Funktion sprintf() à la Berechnung1.txt, Berechnung2.txt usw. In den Zeilen (11) und (12) tun Sie einfach so, als fände eine Berechnung statt. In Zeile (15) erstellen Sie eine neue Datei für die Berechnung mit dem zuvor erzeugten Dateinamen von Zeile (10) und schreiben das Ergebnis der Berechnung in Zeile (16) in die Datei, in diesem Fall nur einen formatierten String mit der Nummer der Berechnung. Konnte keine Datei erzeugt werden, wird stattdessen das Ergebnis der Berechnung in Zeile (19) formatiert und auf die Standardfehlerausgabe, also den Bildschirm, ausgegeben. Auf einigen Systemen werden alle Berechnungen in eine Datei von Berechnung1.txt bis Berechnung999.txt geschrieben. Bei anderen Systemen werden ab einer gewissen Anzahl von Berechnungen nur noch die Ergebnisse auf die Standardfehlerausgabe gemacht, und es wird keine neue Datei mehr angelegt. Warum?

    00  // Kapitel14/aufgabe001.c
    01 #include <stdio.h>
    02 #include <stdlib.h>

    03 int main(void) {
    04 int i = 0;
    05 char filename[255];
    06 FILE *fp[1000];
    07 printf("Programmstart\n");
    08 while( i < 1000 ) {
    09 // Dateinamen basteln mit fortlaufender Nummer
    10 sprintf( filename, "Berechnung%d.txt", i);
    11 // umfangreiche Berechnung hier
    12 // ...
    13 // Ergebnis in eine Datei
    14 fp[i] = fopen( filename, "w" );
    15 if( fp[i] != NULL ) {
    16 fprintf(fp[i], "Ergebnis der Berechnung Nr.%d", i );
    17 }
    18 else {
    19 fprintf(stderr, "Ergebnis der Berechnung Nr.%d", i);
    20 }
    21 ++i;
    22 }
    23 return EXIT_SUCCESS;
    24 }
  5. Erstellen Sie ein Programm, das eine Datei mit folgendem Inhalt ausliest:

    Montag;2345;2341
    Dienstag;3245;1234
    Mittwoch;3342;2341
    Donnerstag;2313;2341
    Freitag;2134;6298

    Die Semikola stellen die Trennzeichen zwischen den einzelnen Werten dar. Folgende Bedeutung fällt den einzelnen Werten zu:

    Tag;Einnahmen;Ausgaben

    Berechnen Sie zusätzlich alle Einnahmen und Ausgaben am Ende der Woche, und erstellen Sie eine Gesamtbilanz, wie viel in der Woche eingenommen bzw. ausgegeben wurde.

    Tipp: Verwenden Sie fscanf() zum formatierten Einlesen.

Im nächsten und letzten Kapitel erfahren Sie noch ein wenig über die Bibliothek time.h und einige grundlegende Zeitroutinen. Mit diesen Routinen können Sie z. B. präzise Warteschleifen im Millisekunden-Bereich realisieren.