Filou Geschrieben 12. Juni 2006 Geschrieben 12. Juni 2006 Hi ich habe ein ganz komisches Problem mit fclose. Ich benutze es zwei mal in 2 verschiedenen Funktionen die nacheinander aufgerufen werden. das erste mal klappts, da wird mit fwrite geschrieben. in der nächsten funktion mit einem neuen handle stürtzt das Programm bei fclose ab. unbehandelte Ausnahme in Test.exe (MSVCRTD.DLL): 0x0c00000005: Access Violation. Dann kommt ein Fenster mit Quellcode suchen und "Geben Sie den Pfad für FCLOSE.C an." Hier ist ein Teil von dem Code: FILE *datei; . . . datei = fopen(g_csProgPfad + "test.txt","r+t"); if(datei!=NULL) {//Nachricht auslesen fread(chBuffer, sizeof(chBuffer), strlen(chBuffer), datei); } . . . fclose(datei); Die Datei wird aber richtig ausgelesen. Kann es was mit den projekteinstellungen zutun haben? Was denkt ihr? Zitieren
Filou Geschrieben 12. Juni 2006 Autor Geschrieben 12. Juni 2006 Ich hab zwar keinen Schimmer wieso, aber mit _fcloseall() hats dann geklappt. Zitieren
Bubble Geschrieben 12. Juni 2006 Geschrieben 12. Juni 2006 Falls g_csProgPfad ein C-String ist, dann kannst Du mit dem "+"-Operator keine weiteren Strings anhängen. Ich gehe daher mal davon aus, dass es sich um eine geeignete Klasse für Strings handelt und hier kein Fehler ist. Dann liegt der Fehler liegt sicherlich woanders im Programm. Zitieren
Filou Geschrieben 12. Juni 2006 Autor Geschrieben 12. Juni 2006 Hallo Bubble Danke für Deine Antwort. Doch es ist ein CString. Das soll das cs im namen sagen. Man kann aber doch immer CStrings mit + addieren. CString A; CString B; A = A + B; Das funktioniert ja auch, die Datei wird ja auch ausgelesen. Zitieren
Klotzkopp Geschrieben 12. Juni 2006 Geschrieben 12. Juni 2006 fread(chBuffer, sizeof(chBuffer), strlen(chBuffer), datei); Wie ist chBuffer deklariert und initialisiert? fread versucht hier, sizeof(chBuffer) * strlen(chBuffer) Bytes zu lesen. Ich vermute, das ist viel zu viel. Dabei schreibst du über das Ende des Arrays hinaus und überschreibst damit, was immer dahinter im Speicher steht. Zitieren
Filou Geschrieben 13. Juni 2006 Autor Geschrieben 13. Juni 2006 Guten Morgen Klotzkopp, char chBuffer[20]; Ich weiß ja nicht im Vorraus wie groß die Datei ist, die ausgelesen wird. Da hab ich halt mal 20 genommen. Aber wenns daran liegt, wieso funktioniert es dann mit _fcloseall(); ? Zitieren
Klotzkopp Geschrieben 13. Juni 2006 Geschrieben 13. Juni 2006 char chBuffer[20];Und steht da schon irgendwas drin, wenn du fread aufrufst? Falls nicht, liefert strlen einfach die Position, an der es das erste Nullbyte findet. Das ist mehr oder weniger zufällig. Dieser Wert wird dann mit sizeof(chBuffer), das ist 20, multipliziert, und soviele Bytes werden gelesen. Ich weiß ja nicht im Vorraus wie groß die Datei ist, die ausgelesen wird. Da hab ich halt mal 20 genommen.Wie gesagt, die Anzahl der Bytes, die fread liest, ist das Produkt der Parameter 2 und 3. Wenn du nur 20 Bytes lesen willst, nimm sizeof(chBuffer) und 1. Und informiere dich bitte nochmal, was sizeof und strlen genau tun. Aber wenns daran liegt, wieso funktioniert es dann mit _fcloseall(); ?Bei undefiniertem Verhalten kann alles passieren. Es lohnt nicht, sich darüber Gedanken zu machen. Ich vermute aber, dass du dir mit deiner Leseaktion den Filepointer überschreibst, weil der im Speicher hinter chBuffer liegt. Die C-Laufzeitbibliothek hat natürlich noch den richtigen Filepointer, und darum funktioniert das. Zitieren
Filou Geschrieben 13. Juni 2006 Autor Geschrieben 13. Juni 2006 Ok, vielen Dank für Deine Hilfe. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.