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?
Filou Geschrieben 12. Juni 2006 Autor Geschrieben 12. Juni 2006 Ich hab zwar keinen Schimmer wieso, aber mit _fcloseall() hats dann geklappt.
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.
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.
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.
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(); ?
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.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden