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
-
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?