Zeichen aus Datei lesen (manchmal nur eins manchmal auch zwei) ?!?!?!



  • #include <stdio.h>
    #include <string.h>
    
    //prüfen ob Ende der Datei erreicht ist
    int check_eof (FILE *datei)
    {
        int a=0;
        a=fgetc(datei);
        if (feof(datei)) return(1);
        else {a=ungetc(a,datei);return(0);}
    }
    
    int main ()
    {
        FILE* datei=fopen("C:/Jochen/bad.cod","r");
    
        while (1)
        {
              if ( check_eof(datei) ) break;
              if ( (i%10) == 0)
              printf ("%2x\n",(unsigned char)fgetc(datei));
              else printf ("%2x ",(unsigned char)fgetc(datei));
              i++;
        }
    
        int i=1;
        scanf ("%c",&i);
    }
    

    Also das Ding soll nur wie ein einfacher Hex-Editor sein.. aber wenn ich die Datei .../bad.cod öffne liest er nur jedes zweite Byte (hab ich mal mit nem Hexeditor in Windows verglichen) und wenn ich eine andere Datei benutze (.../good.cod) dann liest er jedes Byte aus obwohl sich die beiden Dateien nur am Anfang und am Ende je in einem Byte unterscheiden.
    Ich hab bei der check_eof-Funktion auch schon versucht nach den Test-Lesen aus der Datei mit "fseek" wieder eins zurück zu stellen... aber das Problem liegt irgendwie daran, dass die "fgetc"-Funktion bei der einen Datei den File-Pointer immer um zwei vorrückt (jedenfals laut der "getpos"-Funktion)
    hab ich da irgend einen Denkfehler drin oder vil eine ANSI-Funkton falsch benutzt?



  • "rb"



  • Ja das leuchtet mir auch ein... danke!



  • o_O Wieder ein Problem gelöst 🙂



  • auf die funktion 'check_eof' kannste doch verzichten, oder?
    🙂



  • Also so wie ich das mitbekommen hab gibt mir die feof-funktion immer erst dann eine "1" raus wenn ich vorher einen Lesezugriff gemacht habe und schon am Ende der Datei war.. ich möchte mit der check_eof-Funktion aber wissen ob ich das letzte Zeichen schon gelesen hab weil sonst liest mir z.B. die fgetc-funktion nen FF ein... aber kann auch am Compiler liegen weiß ich nicht genau 🙂



  • du kannst ganz einfach einfach 'bevor' du fgetc aufrufst, mit feof testen, ob noch zeichen da sind, dann liest du auch nicht über das fileende hinaus...
    🙂



  • Hmmm.... also ich kenn das halt nur so, dass wenn ich das letzte zeichen ausgelesen hab kommt noch nicht EOF sondern ich bekomm das mit der feof-Funktion immer erst dann, wenn ich nachdem ich das letzte Zeichen ausgelesen hab dann nochmal fgetc (o.Ä.) mache, also quasi wenn ich versuche am Ende der Datei einen Lesezugriff zu machen...
    wenn ich das letzte Zeichen auslese ist EOF bei mir immer noch nicht gesetzt.
    das hat mich auch gewundert aber ich bekomm das immer nur so....



  • eine ganze datei ausgeben kann man z.b. (fp ist ein FILE*) so:

    while (!feof(fp))
      putchar (fgetc(fp));
    

    oder so:

    int c;
    while ((c = fgetc(fp)) != EOF)
      putchar(c);;
    

    also normalerweise braucht man keine extra funktion...
    🙂



  • pale dog schrieb:

    eine ganze datei ausgeben kann man z.b. (fp ist ein FILE*) so:

    while (!feof(fp))
      putchar (fgetc(fp));
    

    oder so:

    int c;
    while ((c = fgetc(fp)) != EOF)
      putchar(c);;
    

    also normalerweise braucht man keine extra funktion...
    🙂

    bessert die zweite Methode, da man bei der ersten Methode auch EOF ausgibt (feof ist nur true, wenn EOF einmal gelesen wurde, _nicht_ wenn das nächste Zeichen EOF ist!)



  • rüdiger schrieb:

    ...da man bei der ersten Methode auch EOF ausgibt (feof ist nur true, wenn EOF einmal gelesen wurde, _nicht_ wenn das nächste Zeichen EOF ist!)

    *schluck*
    du hast recht, das ist ja echt doof...
    😮 😞


Anmelden zum Antworten