Fehler beim Dateiinhalt überschreiben - Fehlercode ÿ



  • Hallo, ich hab für mein Studium die Aufgabe erhalten eine Datei binär in eine Enddatei zu überschreiben. Allerdings kommt bei mir in der Enddatei immer als letztes Zeichen ein y mit 2 Punkten darüber (ÿ). Hat jemand eine Idee warum?
    hier ist mein Code:

    #include <stdio.h>
    #include <stdlib.h>
    
    void override(char *e, char *a) {
        FILE  *fe;
        FILE  *fa;
    
        fe = fopen(e, "rb");
        fa = fopen(a, "wb");
        if(fe==NULL) {
            printf("Fehler beim Oeffnen der Eingabedatei");
            fclose(fe);
            fclose(fa);
            exit(-1);
            
        }
        if(fa==NULL) {
            printf("Fehler beim Oeffnen der Ausgabedatei");
            fclose(fe);
            fclose(fa);
            exit(-2);
            
        }
        if(fe!=NULL){
            while(!feof(fe)){           
                putc(fgetc(fe),fa);         
            } 
            printf("Ueberschreiben der Datei erfolgreich");
        }
        fclose(fe);
        fclose(fa);
        return;
    }
    
    void name() {
        char e[50];
        char a[50];
        e[0]='\0';
        a[0]='\0';
        printf("Eingabe des Namens der Eingangsdatei: ");
        fgets (e, sizeof (e), stdin);
        sscanf(e,"%s",&e);
        printf("Eingabe des Namens der Ausgangsdatei: ");
        fgets (a, sizeof (a), stdin);
        sscanf(a,"%s",&a);
        override(e, a);
        }
    
    int main() {
        name();
        return 0;    
    }
    

    Danke Schon mal für die Antworten 🙂



  • Naja, in Zeile 26 schreibst Du direkt das 'Gelesene' in die Zieldatei, ohne zu prüfen, ob überhaupt noch erfolgreich gelesen werden konnte.
    Das machst Du erst danach im Schleifenkopf in Zeile 25.
    Wenn dort aber festgestellt wird, dass der letzte Leseaufruf schiefgegangen ist, hast Du bereits was auch immer in die Zieldatei geschrieben.
    Also: Lesen, Erfolg prüfen, nur bei Erfolg schreiben.
    Du machst aktuell: Lesen, schreiben, prüfen ob Lesen erfolgreich war.


  • Mod

    Oder etwas konkreter:

    int c;
    while((c=fgetc(fe)) != EOF)
    {
      putc(c, fa);
    }
    

    Von der Form oder ähnlich sehen alle korrekten Lese/Prüfe/Verarbeiten-Schleifen in C (und so ziemlich jeder anderen Sprache) aus. Also die Leseanweisung mit gleichzeitiger Fehlerprüfung als Laufbedingung der Schleife, und dann im Schleifenrumpf die Verarbeitung, die dadurch nur genau dann läuft, wenn es etwas korrekt gelesenes zur Verarbeitung gibt. Wie die konkrete Leseprüfung ausschaut kommt auf die konkrete Leseanweisung an; bei fgetc schaut es ein bisschen unschön aus, wie hier gezeigt.

    Wird leider in vielen schlechten Lehrbüchern falsch gezeigt und durch schlechte Codebeispiele im Netz weiter verbreitet.



  • feof sagt erst "ja" nachdem du versucht hast über das Ende der Datei hinaus zu lesen.
    fgetc gibt -1 zurück wenn du das versuchst.
    Das Bitmuster von -1 ist 0xFFFFFFFF
    Das Zeichen ÿ hat z.B. in den Codepages 1252 und Latin-1 den Code 255, aka. 0xFF.



  • Zeile 12 ist UB, Zeile 13 auch falls fa == NULL ist.



  • Danke für die Antworten, korrigiere gleich mal meinen Code 🙂