Hilfe zum Programm

ibafluss

Erfahrenes Mitglied
Hey liebe Community! :)
Also ich habe folgendes Problem: Im Buch "C von A bis Z" gibt es im Kapitel 16 ein Programm mit der neuen Funktion ungetc(). Ich verstehe schon, dass die Funktion das EOF-Flag löscht und das zuletzt gelesene Zeichen zurückgibt. Nur warum funktioniert dann das folgende Programm so, dass aus einer Datei eingelesen wird, und wenn die Datei zu Ende ist wartet das Programm, bis man etwas neues in die Datei schreibt bzw. dazuschreibt. Kann mir das bitte jemand erklären? :(


Code:
#include <stdio.h>
#include <stdlib.h>

/* bitte anpassen */
#define DATEI "datei.txt"

int main(void) {
   FILE *fp;
   int c;

   fp = fopen(DATEI, "r");
   if(fp == NULL) {
      fprintf(stderr, "Konnte %s nicht öffnen\n", DATEI);
      return EXIT_SUCCESS;
   }
   while(1) {
      while( (c=fgetc(fp)) ) {      /* zeichenweise einlesen */
         if(c == EOF)           /* Ist es EOF. */
            ungetc(c,fp);       /* letztes Zeichen zurück */
         else
            fputc(c, stdout);   /* ausgeben */
      }
   }
   /* Wird nie erreicht. */
   fclose(fp);
   return EXIT_SUCCESS;
}
 
Das verstehe ich schon, aber angenommen ungetc() verschiebt jetzt das letzte Zeichen zurück in den Stream. Dann müsste ja die while-Schleife mit dem Einlesen noch mal mit dem verschobenen Zeichen durchlaufen. Das Zeichen wird dann wieder ausgegeben. Dann kommt wieder EOF und dann wird das zuletzt eingegebene Zeichen wieder gelöscht und in den Stream zurückgeschoben und dann wieder von vorne das ganze oder?
 
Hallo,

das vor dem ungetc() gelesene Zeichen ist EOF, so dass auch nur wieder ein EOF in den Stream zurückgestellt wird. Damit wird die ganze Datei ausgegeben und dann bleibt das Programm ohne eine weitere Ausgabe stehen, weil ja EOF nicht ausgegeben wird.
Die äußere Schleife mit "while(1)" ist eigentlich unsinnig, weil das Programm auch schon aus der inneren Schleife nicht herauskommt.

Gruß
MCoder
 
Die Erklärung steht 4 Absätze weiter unten und betrifft das Verhalten von ungetc() bei EOF (habe ich auch nicht mehr gewusst): Die Funktion stellt kein EOF zurück sondern löscht stattdessen das EOF-Flag , so dass diese Schleife möglich wird.

Gruß
MCoder
 
Ok aber eine letzte Frage noch: Wird jetzt das Zeichen vor EOF auch zurückgeschoben oder wird nur EOF gelöscht? Weil wenn es zurückgeschoben wird, wird es ja gleich danach wieder ausgegeben oder?
 
Laut Funktionsbeschreibung von ungetc() wird kein Zeichen zurückgestellt, sondern nur der EOF-Status des Filestreams gelöscht.

Gruß
MCoder
 
Zurück