Wieso kommt es bei fclose zum Speicherfehler ?



  • Also ich versteh das nicht

    int codieren (char *quelle , char *ziel , char *pass)
    {
        FILE *FPquelle,*FPziel;
    
        FPquelle = fopen (quelle,"r");
        FPziel = fopen (ziel,"w");
    
        fclose (FPquelle);
            fclose (FPziel);  
    return (0);
    }
    


  • Hi!

    Schau doch einfach mal vorher nach ob fopen was zurückgegeben hat.
    Vielleicht gibt es die datei aus der du lesen möchtest ja noch gar nicht.



  • trotzdem dürfte es deswegen nicht abstürtzen



  • Original erstellt von <Dawai>:
    trotzdem dürfte es deswegen nicht abstürtzen

    Das kommt aber stark auf die Bibliothek an. Wenn fopen z.B. NULL zurückliefert und man dann fclose aufruft, kanns sehr wohl nen Speicherfehler geben. Mit GCC 3.2 auf Windows 2000 tuts zumindest.

    PS:
    Testprogramm:

    #include <stdio.h>
    
    int main() {
       fclose(NULL);
       return 0;
    }
    

    [ Dieser Beitrag wurde am 21.01.2003 um 19:18 Uhr von TriPhoenix editiert. ]



  • Nun, wenn FPquelle =NULL ist schon. Da C keine exceptions kennt, was soll fclose dann sonst machen?

    try it:

    #include <stdio.h>
    
    int main()
    {
        FILE *a;
    
        a=NULL; // das gleiche als wenn fopen null returnt
    
        printf("hallo Welt\n");
        fclose(a);
    
        printf("This text will never be shown\n");
    
        return 0;
    }
    


  • Original erstellt von xroads42:
    **Nun, wenn FPquelle =NULL ist schon. Da C keine exceptions kennt, was soll fclose dann sonst machen?
    **

    Eben, ich widerspreche ja auch nur Dawai 🙂

    FPquelle ist wohl dann NULL, wenn wie du schon sagtest, fopen scheitert. @Ita12_Rafael: du solltest mal eine Fehlerbehandlung in dein Programm bauen 🙂



  • Und warum prüft fclose nicht intern auf NULL und macht dann nichts? Das ist doch blöd, wenn das Ding abstürzt.



  • Original erstellt von TriPhoenix:
    **Eben, ich widerspreche ja auch nur Dawai 🙂

    FPquelle ist wohl dann NULL, wenn wie du schon sagtest, fopen scheitert. @Ita12_Rafael: du solltest mal eine Fehlerbehandlung in dein Programm bauen :)**

    ot:
    @TriPhoenix: war auch keine antwort auf dein beitrag(sondern auf <Dawai> )...mußte erst mal meinen Complier suchen 🙄



  • Was soll das, das ihr alle auf mir rumhackt? 😡 😡
    Mein Beitrag war anscheinend falsch, aber kann man das nicht vernünftig sagen, anstatt hier sofort mit Beleidigungen auf mich loszugehen? 😞



  • Ruhig Brauner, ruhig. Niemand hat Dich beleidigt...



  • Original erstellt von <Helge>:
    Und warum prüft fclose nicht intern auf NULL und macht dann nichts? Das ist doch blöd, wenn das Ding abstürzt.

    Vermutung:
    Weil fclose nicht weiß warum der übergebene Pointer NULL ist, und wie es dann reagieren soll. Nichts tun ist nicht wircklich eine lösung. Was ist wenn der nutzer nur ausversehn den Pointer auf null gesetzt hat, und denkt die Datei, die er eigentlich schließen wollte, nicht geschlossen wird? Am ende des Programms sind im schlimmsten fall alle Daten futsch ( stichwort Streams und Puffer). Da ist ein absturz in der Testphase wohl doch besser.

    Und ein

    if(pFile==NULL)
          do_something();
    

    Ist ja kein beinbruch.

    edit: Sch*** rechtschreibfehler...

    [ Dieser Beitrag wurde am 21.01.2003 um 20:31 Uhr von xroads42 editiert. ]



  • fopen scheiterte schon und deshalb funzte auch fclose nicht .

    Danke für die Antworten



  • Original erstellt von <Dawai>:
    Was soll das, das ihr alle auf mir rumhackt? 😡 😡
    Mein Beitrag war anscheinend falsch, aber kann man das nicht vernünftig sagen, anstatt hier sofort mit Beleidigungen auf mich loszugehen? 😞

    Heyhey...beleidigen woltle ich hier keinen (hab ich auch nicht)...ich finde ich habe recvht vernünftig gesprochen 🙂

    Original erstellt von <Helge>:
    Und warum prüft fclose nicht intern auf NULL und macht dann nichts? Das ist doch blöd, wenn das Ding abstürzt.

    Naja zum einen ists halt ne Userbibliothek, die auf den Zeuger zugreift. Und selbst wenn, was soll fclose davon dann halten...stillschweigen ist keine vernünftige Fehleranzeige und ein Rückgabewert bringts auch nicht, weil wenn fclose erst den fehler meldet ist vorher ja shcon alles schiefgegangen. Die Fehlerbehandlung muss nunmal (leider) der User schrieben 🙂



  • warum soll ich in fclose die kosten eines ifs tragen? es kann sowieso keine ungültigen Dateizeiger geben, da ich mindestens einmal lese oder schreibe (sonst öffne ich die datei ja nicht) - dadurch stürtzt das Programm sowieso schon vorher ab, bzw. garnicht, weil man nunmal auf fehler überprüfen tut.


Anmelden zum Antworten