Alignment und fwrite



  • Wenn ich so eine Struktur speichern soll:

    struct Dateikopf{
     short MagNum;
     long DatGro;
     /* usw. */
    };
    Dateikopf A = {3,5L};
    FILE* fp = fopen("Datei", "wb");
    

    ... dann ist die Datei bei dieser Version:

    fwrite(&A, sizeof(struct Dateikopf), 1, fp);
    

    ... allerdings um 2 Bytes groesser als erwartet.

    Wenn ich es anders anstelle:

    fwrite(&A.MagNum, sizeof(short), 1, fp);
    fwrite(&A.DatGro, sizeof(long), 1, fp);
    

    ... also in 2 Teilschritten, dann passt die Groesse. (2+4 = 6).

    Habe ich irgendwelchen 'geheimen' Zusatzbytes belegt, wenn ich die Struktur 'als Ganzes' in die Datei schreiben möchte? Ich seh' nur einen short und einen long Wert da drinnen stehen. Ist die Struktur also größer als die Summe ihrer Einzelteile?

    Wäre nicht uninteressant zu erfahren, weil wenn jemand die Datei wieder lesen möchte, dann kann er ja unmöglich wissen, ob ich die Daten auf die (1.) oder die (2.) Art in die Datei geschrieben habe. Die 2. Version ist zwar unbequemer, aber immerhin scheint man damit (aus welchen Gründen auch immer) Speicher zu sparen.

    Auf welche Weise würdet Ihr vorzugsweise beim Schreiben vorgehen, bzw. wenn jemand die Datei einlesen möchte und die Struktur kennt, aber nicht weiß, ob die Struktur 'als Ganzes' oder 'stückchenweise' in die Datei geschrieben wurde, wie könnte der das dann herausfinden, wie beim Erzeugen der Datei vorgegangen wurde?

    Thx für Tipps!


  • Mod

    So geheim ist das nicht. Guck dir mal den Wert an, den sizeof zurückliefert 🙂 .

    Was du da "entdeckt" hast, nennt man Padding und Alignment. Google wird da sehr viel zu ausspucken.



  • Neben Ausrichtungsproblemen musst du für Plattform/Compiler-Unabhängigkeit auch die Bytefolge beachten. Hier müsstest du wie bei den anderen Problemen auch die Struktur um entsprechende Informationen ergänzen, in welchem der möglichen Formate die Datei erzeugt wurde. Oder du verwendest 1 großes Stringfeld als "Quasi-Struktur" und parst dann eben. Ist zwar unelegant aber maximal padding/alignment/endian-unabhängig.


Anmelden zum Antworten