Veröffentlicht 12. Juni 200619 j 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?
12. Juni 200619 j 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.
12. Juni 200619 j 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.
12. Juni 200619 j 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.
13. Juni 200619 j 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(); ?
13. Juni 200619 j 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.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.