ReadFile ändert eigenständig Variablen?



  • Hallo,

    ich hab ein seltsames Problem mit ReadFile. Ich schreibe mit WriteFile Strukturen in ein File und lese sie mit ReadFile wieder aus. Das klappt auch alles wunderbar.

    Die Struktur heißt objectList { ... }.
    Zusätzlich gibt es noch einen Pointer auf diese Struktur.

    typedef struct objectList *dbOL;
    

    Jetzt kurz der Code, der komische Dinge macht. 😉

    dbOL	oL = NULL;
    DWORD	bytesRead = 0;	
    
    SetFilePointer(hFile, NULL, NULL, FILE_BEGIN);
    
    BOOL tempVar = TRUE;
    dbOL temp = oL;
    
    while(tempVar)
    {
        struct dbObject obj;
        tempVar = ReadFile(journal, &obj, blocksize, &bytesRead, NULL);
    
        // ab hier gehts dann so weiter, dass die ausgelesene Struktur in eine List von Strukturen gehangen wird, dessen Anfang durch oL markiert wird
    

    Bis zum Ausführen von ReadFile hat oL den Wert NULL (0x0). Nachdem ReadFile ausgeführt wurde, steht laut Debugger in oL 0xcccccccc.

    Kann mir jemand einen Tipp geben, warum sich die Variable dort ändert? Die wird doch gar nicht verwendet.

    Vielen Dank,
    Ronny


  • Mod

    Jede Wette das blocksize größer als die Objektgröße von obj ist. Du überschreibst vermutlich den Stack.
    Evtl. steht in Deiner Datei auch die 0xcc Daten. Das würde bedeuten, dass Du nicht initialisierten Speichher auch geschrieben hast.



  • Hallo,

    vielen Dank für den Hinweis. Genau das war das Problem.

    Ich schreibe die Strukturen als Blöcke (Vielfaches von 512 Byte) auf die Festplatte. Damit lese ich natürlich mehr Bytes zurück, als die Struktur groß ist. Ich habe das korrigiert und jetzt klappt es.

    Noch eine Frage dazu. Ist es problematisch, wenn ich eine Struktur habe die zB 490 Byte groß ist, ich aber 512 Byte in das File schreibe? So lange ich nur 490 Byte lese und dann den FilePointer jeweils auf die nächsten 512 Byte rücke, sollte das doch kein Problem sein, oder?

    Besten Dank,
    MFG


  • Mod

    Schon. Die Frage ist nur, was beim schreiben passiert. Es ist ja nicht gesagt, dass das 491 Byte überhaupt noch addressierbar ist!

    Also einfach brutal 512 Bytes schreiben obwohl die Struktur nur 490 Byte sgroß ist halteich für falsch.
    Du müsstest den rest entsprechend selbst auffüllen.



  • Ok, dann werde ich den Rest einfach mit leerzeichen o.ä. füllen.

    Besten dank.

    mfg



  • Klappt das:

    tempVar = ReadFile(journal, &obj, [b]sizeof(obj)[/b], &bytesRead, NULL);
    

    ?



  • Ja, das klappt.

    Wie gesagt, ich hatte ja nur noch das Problem, dass der Rest zwischen der Blocksize und dem sizeof(obj) mit "Müll" gefüllt wird. Jetzt schreibe ich dort Spaces rein.

    MFG


Log in to reply