Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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?

Geschrieben

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.

Geschrieben

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.

Geschrieben

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.
Geschrieben

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(); ?

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...