Problem mit fclose
-
Und ab jetzt sparen wir uns die schlechten Witze
-
Hallo.
@SideWinder:Ja nachdem ich darauf hingewiesen wurde, dass ich im falschen Forum war, hab ich das gleiche hier nochmla gefragt.
Mein Code ist ganz easy:
char pLine[3600] = {0}; char pNewLine[3600] = {0}; WORD key[3]; key[0] = 0x0021; key[1] = 0x1578; key[2] = 0x3333; pFile = fopen(path,"rb"); fseek(pFile, 0, SEEK_END); int length = ftell(pFile); fseek(pFile,0,SEEK_SET); fread(pLine, 1, length, pFile ); [b]fclose(pFile);[/b] randomValue = testMethod(pLine, pNewLine, (length-1), key); ...
Das Problem taucht nun nach fclose() auf.
Der Wert randomValue ist nicht korrekt, wenn fclose vorher ausgeführt wird. Wenn ich es danach ausführe klappt es, bzw. wenn ich nen sleep(200) nach fclose mache.An sich ist es ja kein Problem, fclose erst nach dem Funktionsaufruf zu machen, aber ich versteh nicht wo das Problem liegt - also warum es so nicht funktioniert.
Gruß
-
Wie groß ist denn die Datei, die du da einliest?
-
4KB, also nicht so riesig.
-
stephie schrieb:
4KB, also nicht so riesig.
Aber auf jeden Fall größer als das Array, in das du sie einliest - und das bedeutet unweigerlich Probleme.
(fread() prüft nicht, ob es wirklich genug Platz hat (kann es gar nicht), sondern überschreibt fremde Datenbereiche, wenn du mehr Daten einlesen willst als du Platz hast - und in deinem Fall hast du womöglich den Inhalt von pFile zerstört.
-
Hmm, also wenn ich mir mein Array anschaue (pLine) dann stehen da alle Daten drin. Der letzte Eintrag ist an Stelle 3386 zu finden.
Passt das dann nicht?Generell werd ich aber was einbauen, um dieses Problem bevor es auftritt abzufangen - also schon mal danke für den Hinweis.
Aber an der Stelle ist es glaub nicht das Problem, oder?!
-
...wobei, ich gebe doch bei fread() die Länge des files mit.
Ist es damit nicht schon getan?
-
stephie schrieb:
...wobei, ich gebe doch bei fread() die Länge des files mit.
Ist es damit nicht schon getan?Nein, du solltest vorher auch überprüfen, ob das Ziel groß genug ist, um die komplette Datei zu schlucken (fread() verlässt sich darauf, daß du genug Platz zur Verfügung hast).
-
Ah ok, dann mach ich das mal.
Aber seh ich das richtig, dass es in diesem Fall nicht das Hauptproblem ist?Denn meine Daten stehen ja alle im Array drin.
-
Das ist das Problem.
Klar können in Deinem 3600 Stellen langen Array auch 4000 gültige und richtige Bytes drinstehen, nur dass die letzten 400 Byte nicht mehr zu Deinem Array gehören sondern irgendjemand anderes. Vielleicht dem FILE-Handle. Vielleicht dem Betriebssystemkern. Vielleicht auch niemandem. Das nennt man undefiniertes Verhalten, weil Du eben an ganz anderen Stellen Probleme deshalb bekommst, oder u.U. auch niemals.BTW: Dadurch dass Du fread mitteilst dass Du nur die Größe der Datei lesen willst hast Du aber noch nicht sichergestellt dass diese Größe auch in Dein Array passt, oder?
-
Ah ok, dann mal merci und ich bau das mal schön ein.
Danke.