String in Datei speichern
-
Hi!
Hab mal wieder ein Problemchen.
Ich speichere verschiedene Koordinaten von Symbolen in einer Datei ab und will diese auch öffnen.
Das klappt auch, aber wenn ich einen String (der auch zu dem Symbol gehört) abspeichern will bekomme ich nen falschen Wert beim öffnen der Datei wieder zurück.Wie muss ich meinee folgenden Zeilen ändern damit ich ordentlich speichern und öffnen kann?
ar.Write((string*)&this->beschreibung, sizeof(this->beschreibung));ar.Read((string*)&besch, sizeof(this->beschreibung));Hier auch zur Vollständigkeit der gesamte Quelltext:
void ParamAktivitaet::serialize(CArchive& ar) { //eigene elemente laden/speichern if (ar.IsStoring()) { //schreibe SERIAL 0 - 127 char SERIAL = SERIAL_PARAMAKTIVITAET; ar.Write(&SERIAL, 1); ar.Write((char*)&this->rechtsUnten.x, sizeof(this->rechtsUnten.x)); ar.Write((char*)&this->rechtsUnten.y, sizeof(this->rechtsUnten.y)); ar.Write((string*)&this->beschreibung, sizeof(this->beschreibung)); } else { LONG x, y, besch; ar.Read((char*)&x, sizeof(this->rechtsUnten.x)); ar.Read((char*)&y, sizeof(this->rechtsUnten.y)); ar.Read((string*)&besch, sizeof(this->beschreibung)); rechtsUnten = CPoint(x, y); beschreibung = besch; } //Textelemente speichern/laden lassen Zeichnung::serialize(ar); }Zur Info: Beim Debuggen seh ich, dass in der Schleife zum Speichern der String richtig übernommen wird. Wird mir aber dann beim Öffnen in ne Zahl "zerhackt".
Wäre nett wenn mir jemand mal die beiden Zeilen umschreiben kann.
Schon mal danke für eure Hilfe.Gruß Mav
-
Hoppla!
void ParamAktivitaet::serialize(CArchive& ar) { //eigene elemente laden/speichern if (ar.IsStoring()) { .... ar.Write((string*)&this->beschreibung, sizeof(this->beschreibung)); } else { LONG x, y, besch; .... // Hier liest Du an die Adresse einer LONG Variablen etwas ein. // Nur wieviel (und das vor allem auf ein 32 Bit grossen Bereich)! // Wie gross ist "sizeof(this->beschreibung)" beim Laden? // Gar nicht gut!!! ar.Read((string*)&besch, sizeof(this->beschreibung)); .... // und das ist dann normalerweise sowieso tödlich ... beschreibung = besch; } .... }Jetzt müsste ich erst mal die Deklaration Deiner Membervariablen "beschreibung" kennen.
-
Beschreibung ist einfach ein eingelesener String.
Ich gebe in einem Dialog "xyz" ein und das ist dann unter beschreibung gespeichert.
Nur speichert das Programm mir das nicht in der Datei richtig ab bzw. holt es da nicht richtig raus.
Im Endeffekt geht es mir nur darum, wie ich einen beliebigen String hier korrekt speichere und wieder öffne und in beschreibung ist eben der String enthalten.Beschreibung ist --> CString ParamAktivitaet::beschreibung
Gruß Dirk
-
Also "beschreibung" ist ein CString.
Warum dann nicht einfach:
void ParamAktivitaet::serialize(CArchive& ar) { //eigene elemente laden/speichern if (ar.IsStoring()) { .... ar << beschreibung; } else { LONG x, y, besch; .... ar >> beschreibung; } .... }übrigens, Du implementierst eine Dateiversionierung.
//schreibe SERIAL 0 - 127 char SERIAL = SERIAL_PARAMAKTIVITAET; ar.Write(&SERIAL, 1);Das ist prinzipiell gut. Aber Lesen muss man die dann auch wieder!
-
TATSACHE!!!!!
Das Gute liegt so nah

Funktioniert einwandfrei.
Hab dann doch zu kompliziert gedacht
Vielen Dank.
Gruß Mav