Binärdatei schreiben
-
Hallo!
Ich habe ein struct, das ich mit einem reinterpret_cast in eine Binärdatei speichere. Jetzt möchte ich mehrere dieser structs puffern, und mehrere mit einem write befehl in die Datei speichern. Als Puffer dient ein vector, und den möchte ich wie folgt speichern:
vector<SignalValue*>::iterator v_iterator; for (v_iterator = sv_vector.begin(); v_iterator!=sv_vector.end(); v_iterator++) { strcat(data, reinterpret_cast<char *>(&v_iterator)); } file.open(path.c_str(),ios::out|ios::binary|ios::app); file.write(data, sizeof(SignalValue)*cur_buffer_size); file.clear(); file.close();So funktioniert es leider nicht richtig. Kann mir jemand helfen?
Danke schon mal im Voraus.
MfG
-
strcat() arbeitet mit Null-terminierten Zeichenketten - und ich glaube kaum, daß deine structs in sich Null-terminiert sind. Wenn du schon alle struct's in einen gemeinsamen Speicherbereich zusammenpacken willst, nimm lieber memcpy() dafür. (aber afaik liegen sie in deinem vector schon unmittelbar hintereinander)
-
Hmmm,
liegt da nicht noch tiefer der Wurm drin ?
vector<SignalValue*> // speichert ZEIGER auf SignalValue's vector<SignalValue*>::iterator // ist dementsprechend ein Iterator (= eigene Klasse) auf einen Zeiger &v_iterator // verweist auf die Adresse des Iterator-Objekts (das wiederum auf einen ZEIGER auf ein SignalValue dereferenziert werden kann - per Dereferenzierungs-Op)Einfachste Variante: Gar nicht binär abspeichern, sondern mit definierter Serialisierung (Compilerunabhängig, lesbar, ...)
Zweiteinfachste Variante:
vector<SignalValue> v; // Warum Zeiger abspeichern, wenn Objekte selbst gehen: for(size_t i=0; i<v.size(); ++i) { file.write(reinterpret_cast<char *>&v[i], sizeof(SignalValue)); }Falls Du aus irgendwelchen Gründen einen vector<SignalValue*> brauchst, musst Du theoretisch nur noch den "&" weglassen ... AAAAAABER: Wenn Du polymorph arbeitest, stimmt die Größe nicht mehr => tut's so nicht.
Aber wie gesagt: Ich bin nicht für binäres Abspeichern. Bringt IMO nur selten Vorteile, die die Nachteile überwiegen.
Gruß,
Simon2.