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



  • Hey ho, dies ist meine erste Frage überhaupt in solch einem Forum und ich habe ein recht merkwürdiges Problem...
    Die eingefleischten C-Profis werden mir sicher sagen können was da falsch läuft...

    Ich versuche ganz stinknormal aus einer als zeichenorientiert angelegten Datei, nun die Bytes wieder einzeln mit der "fgetc"-Funktion aus zu lesen. Nun das absolut unverständliche für mich...
    ich habe zwei exakt gleich große Dateien, die sich nur im ersten und ein paar der letzten Bytes unterscheiden. Bei der einen Datei rückt der Filepointer immer gleich zwei Stellen vor, wenn ich mit "fgetc" (oder auch getc oder auch scanf) etwas auslese und bei der anderen Datei ganz normal ein Byte...
    Weiß irgendjemand woran das liegen kann?



  • Wie wärs wenn du uns mal den Code hier reinpostest. Vielleicht hast du ja einen Fehler gemacht, den wir so nicht nachvollziehen können?

    Gruß



  • #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