fstream: mehrere structs nacheinander auslesen?



  • Hi,

    Ich habe ein Problem mit dem einlesen einer binären Datei.
    Ich habe ein struct FileStruct, was wiederum aus den beiden structs header und data besteht.
    Wenn ich das ganze struct FileStruct komplett einlese ist alles wunderbar, wenn ich aber erst header und dann data einzeln einlese ist data fehlerhaft:

    Hier die Structs:

    struct ffsfile_t
    {
    	header_t header;
    	data_t data;
    };
    

    Hier der fehlerhafte Code:

    ffsfile_t FileStruct;
    
    //Open File!
    ifstream ffsfile( "...", ios::binary );
    ffsfile.read( (char*)&FileStruct.header, sizeof(FileStruct.header));
    ffsfile.read( (char*)&FileStruct.data, sizeof(FileStruct.data));
    

    Nun meine Frage:
    Wie kann ich zwei Teile einer Datei nacheinander einlesen?



  • eigentlich müsste das so gehen. vielleicht liegt das am alignment der elemente, keine Ahnung. Überprüf mal, ob sizeof(a)+sizeof(b)==sizeof(grosse_struct).



  • Der Fehler lag im Abspeichern des Structs!
    Wenn ich FileStruct als ganzes abspeicher funktionierts nicht. Wenn ich allerdings(analog zum Einlesen) zuerst FileStruct.header und dann FileStruct.data abspeicher dann funktioniert auch das Einlesen.

    Scheinbar schreibt das Programm die komponenten des Structs nicht in der Reihenfolge in der ich sie programmiert hab.



  • RedPuma schrieb:

    Scheinbar schreibt das Programm die komponenten des Structs nicht in der Reihenfolge in der ich sie programmiert hab.

    Mit Sicherheit nicht.

    Hast du Maxi's Größenvergleich gemacht!?

    greetz, Swordfish



  • Habe einen Größenvergleich angefertigt:

    int size1 = sizeof( tgaImage.colormapspec );
    int size2 = sizeof( tgaImage.colormapspec.origin ) 
              + sizeof( tgaImage.colormapspec.length ) 
              + sizeof( tgaImage.colormapspec.size );
    

    Wobei colormapspec wirklich nur aus 2 mal short int und einmal BYTE besteht.

    Die Größe size1 entspricht (falsch) 6 Byte.
    Die Größe size2 entspricht (vollkommen richtig) 5 Byte.

    Evtl wird ein Byte für das Struct reserviert und mit ausgelesen? Es geht mir hierbei nur noch ums Verständnis, ich kann ja mit seekg arbeiten, alle typen einzeln auslesen oder (wohl die beste lösung) eine feste größe bei fstream::read angeben.


Anmelden zum Antworten