Liste in eine binär Datei speichern mit Typinformation



  • Hallo,

    ich soll eine Liste in eine binärdatei speichern, dabei soll die Typinformation erhalten bleiben. Wie geht das? Ich habe keine Idee wie ich das machen soll.

    Viele Grüße


  • Mod

    Entweder durch Konvention (Format der Daten steht fest) oder indem du irgendwie mit abspeicherst, was du da schreibst.



  • Wenn es eine Aufgabe ist: Nimm dir stift und papier und denk dir ein Format aus.

    Hier ein beispiel wie du einen integer binär in eine Datei schreiben kannst:

    std::ofstream writer{"bla", std::ios_base::binary};
    uint32_t toWrite = 17; 
    writer.write(reinterpret_cast<char const*>(&toWrite), sizeof(toWrite));
    

    Bemerke, dass ich uint32_t absichtlich gewählt habe, weil 'int' ist nicht platform übergreifend gleich groß (in bytes). Das Problem kannst du natürlich lösen indem das mit kodiert ist.



  • @5cript sagte in Liste in eine binär Datei speichern mit Typinformation:

    Bemerke, dass ich uint32_t absichtlich gewählt habe, weil 'int' ist nicht platform übergreifend gleich groß (in bytes).

    Dabei wäre noch anzumerken dass der "innere Aufbau" von uint32_t auch nicht plattformübergreifend gleich ist. Stichwort Endianness.



  • Keine Ahnung, ob die Endianness für den OP eine Rolle spielt.
    Es ist allerdings nie ganz verkehrt, wenn die Endianness (wie bei Exif-Daten) schon in der ersten Version mit reingeschrieben wird, auch wenn diese Unterscheidung vom Programm selber noch gar nicht unterstützt wird.
    Aber geht es nur um PODs?

    std::vector<float>;
    // oder
    std::vector<int32_t>;
    // oder
    std::vector<double>;
    

    Oder

    class A
    {
      std::string str;
      double value;
    };
    class B
    {
    ...
    };
    // immer gleicher Typ:
    std::vector<A>;
    // oder
    std::vector<B>;
    

    Oder

    class A;
    class B : public A;
    class C : public B;
    std::vector<A*>; // bzw. std::vector<std::unique_ptr<A>>;
    

    Vom Aufwand her unterscheiden sich diese Fälle nämlich nicht unerheblich (erst recht, wenn es nicht beim Speichern alleine bleiben soll 🙃 ).



  • @yahendrik sagte in Liste in eine binär Datei speichern mit Typinformation:

    Es ist allerdings nie ganz verkehrt, wenn die Endianness (wie bei Exif-Daten) schon in der ersten Version mit reingeschrieben wird,

    Man kann auch eine Endianess festlegen.



  • Ja, Endianness festlegen wäre die bessere Variante 🙂
    Dabei bleibt der Code einfacher - und das nicht nur so lange man nur eine Plattform/Endianness untertstützt. Auch wenn der Code auf LE und BE laufen muss ist es angenehmer wenn die Daten in einer fixen Endianness reinkommen.



  • Erstmals, danke für die Hilfe.

    Das ganze ist für mich echt schwierig, da ich sonst nur Daten vom selben Datentyp speichere.



  • Deine Angaben sind ja sehr vage. Vielleicht möchtest du dir mal https://www.boost.org/doc/libs/1_75_0/libs/serialization/doc/tutorial.html angucken?


Log in to reply