Vector in Datei Speichern
-
Hallo zusammen,
ich hoffe ihr könnt mir mal wieder weiter helfen.
wie würdet ihr soetwas mit wenig aufwand in eine datei speichern und nachher wieder auslesen?
struct TTest { String String1; String String2; String String3; int Int1; }; std::vector<TTest> VecTest; VecTest[0].String1="String0_1"; VecTest[0].String2="String0_1"; VecTest[0].String3="String0_1"; VecTest[1].String1="String1_1"; VecTest[1].String2="String1_2"; VecTest[1].String3="String1_3";
gibt es eine VCL Variante mit der sowas möglich ist? Oder nutzt man am besten das gute alte FILE mit fopen,fwrite etc?
-
EDIT: arg nicht gesehen dass das ne struct war, gib mir nochmal Nachdenkzeit
Schnelle Antwort:
für jedes Objekt:
TMemoryStream* / TFileStream* und dann größe der Instanz + Serialisation von Struktur hinterherschieben. (evtl. auch jeden Member einzeln speichern, ich weiß nicht, wie sich das mit Delphi Klassen verhält)beim Lesen wieder die Größe und dann Größe mal bytes zurück in das Objekt.
Daten die nicht POD sind, sind immer etwas weniger schön abzuspeichern.
-------------------------------
und wenn Standard, dann besser std::ofstream und std::ifstream statt die C Alternative. Das Prinzip bleibt aber das Selbe.
EDIT: Vielleicht hat ja jemand eine schickere Idee, wobei AFAIK ist das grob der gängige Weg.
-
Hallo,
Ich würde die Standard C++ Variante nehmen und dabei noch der struct die passenden Eingabe- und Ausgabe-Streamoperatoren verpassen.
Etwa so (in Textform):struct TTest { String String1; String String2; String String3; int Int1; }; std::ostream& operator<<(std::ostream& out, const TTest& val) { out << String1 << " " << << String2 << " " << String3 << " " << Int1 << "\n"; } // Anwenden std::vector<TTest> VecTest; // vector befüllen std::ofstream out("Test.txt"); // vector ausgeben for( unsigned int i=0; i<VecTest.size(); ++i) out << VecTest[i];
Passend dazu auch noch den Inputoperator.
Das Ganze ist jetzt im Textformat. Wenn du die Daten binär speichern willst, was ich nicht empfehle, musst du anders vorgehen. Da kann man z.Bsp. der struct separate read/write Funktionen verpassen.
-
Hmm...
ist ja dann doch relativ viel Tipparbeit wenn man mehere gößere strukturen und dann noch verschachtelt abspeichern will.
-
Da kommst du nicht groß drum rum. Andererseits hast du so auch immer die volle Kontrolle über diese Vorgänge.
In der VCL gibt es noch die Klasse TReader welche für das Lesen und Schreiben von VCL Komponenten zuständig ist. Das kannst du dir ja mal anschauen. Dann musst du natürlich aus deiner Struct eine VCL-Komponente machen.
Es gibt außerdem noch externe Serialisierungsbibliotheken (siehe boost::serialization). Aber auch da musst du dich erst einarbeiten und du erzeugst zusätzliche Abhängigkeiten.
-
Danke für die Hilfe,
ich hab mir das serialize von der Boost Bibliothek mal angeguckt, hab auch ein schönes tutorial gefunden.
http://www.highscore.de/cpp/boost/serialisierung.html
leider hab ich dabei ein Problem. Wenn ich das Programm mit Debug Einstellungen starte kommt beim Ausführen dieser Zeile
std::ofstream file("c:\\archiv3454.txt");
ein Access Violation Fehler. Der Debugger bleibt dann in der xlocale an dieser Stelle stehen:
#if __BORLANDC__ /* compiler test */ *(size_t *)&table_size = 1 << CHAR_BIT; // force space reservation #endif /* __BORLANDC__ */
Mit Release Einstellungen funktioniert das abspeichern.
Hat jemand eine Idee was da falsch eingestellt sein kann??
-
Ich denk mal ich hab die Einstellung gefunden. Wenn "Mit dynamischer RTL linken" aktiviert ist, dann bekomme ich genannte Fehlermeldung.
-
Das ist ein bekannter Fehler.
siehe:
http://qc.embarcadero.com/wc/qcmain.aspx?d=37491