String speichern laden --> Fehler?
-
Hi,
habe schon im Forum gesucht, leider erfolglos.
Also ich will ein String speichern und es wieder Laden und ausgeben. Nur leider wird nach dem laden dem String so seltsame Zeichen angehängt. Z.b. wenn ich "Cube" speichere, lade und dann ausgebe kommt "Cube" - warum? Könnt ihr mir helfen?Hier der Code:
// S P E I C H E R N TFileStream* Strm = new TFileStream(Filename, fmCreate); /* [...] andere daten werden geschrieben */ short NSize = Layers.Name.Length(); Strm->Write(&NSize, sizeof(short)); Strm->Write(Layers.Name.c_str(), Layers.Name.Length()); /* [...] andere daten werden geschrieben */ delete Strm; // L A D E N // Stream erstellen TFileStream* Strm = new TFileStream(OpenPictureDialog1->FileName, fmOpenRead); [...] sonstige daten laden sLayer NewLayer; short NSize = 0; Strm->Read(&NSize, sizeof(short)); char* buffer = new char[NSize]; Strm->Read(buffer, NSize); NewLayer.Name = buffer; delete buffer; [...] sonstige daten laden // Datei freigeben delete Strm;danke schonmal im Voraus
-
Salim,
Speichern und Laden sieht korrekt aus. Erst bei folgender Zeile...Salim schrieb:
NewLayer.Name = buffer;...interpretierst Du "buffer" als C-String. Ein C-String ist eine Character-Array, daß durch ein 0-Byte termininiert (abgeschlossen) ist. Da dies bei Dir nicht der Fall ist, ist nicht klar, wo Dein C-String aufhört. Daß nur ein Leerzeichen zuviel ist, ist reiner Zufall. Es hätten auch 42 total sinnlose andere Zeichen sein können.
char* buffer = new char[NSize + 1]; buffer[NSize] = 0;Das ganze ist ein klassisches Problem und jedes gute Buch wird Dir dazu Informationen liefern ...
-
Ooops. Wusste ich nicht. Ich dachte der speichert und ladet den "Null Terminator" automatisch. Ich programmiere ja eigentlich auch mit VC++ Spiele, da hat meine keine BCB Strings, deswegen wusste ich das nicht.
Ich hoffe ihr Verzeit mir den dummen Fehler
Also ich hab jetzt das so gemacht wie du es gesagt hast, hab nur " = '\0';" als Terminator geschrieben, kann ja sein dass das das Gleiche ist, aber ist halt gewohnheitssache. Und tatsächlich, es klappt!
Vielen vielen vielen Dank!
-
Salim schrieb:
... Ich programmiere ja eigentlich auch mit VC++ Spiele, da hat meine keine BCB Strings, deswegen wusste ich das nicht. ...
Ich bin mir zu 100% sicher das du im VC++ Compiler ebenfalls char-Arrays mit einem 0-Byte abschließen musst.

-
Nicht wenn du z.B.:
char* String1 = "Mein String1"; char* String2 = "Mein String2"; printf("%s %s", String1, String2);machst, oder irre ich mich da?
... Ich programmiere ja eigentlich auch mit VC++ Spiele, da hat meine keine BCB Strings, deswegen wusste ich das nicht. ...
Außerdem hatte das eher damit zu tun, dass ich dachte der BCB String das automatisch macht.