Registriert: Di Dez 02, 2003 12:47 Beiträge: 300 Wohnort: Marburg
Tach, ich speicher alle meine Sachen (3DModelle Scenen usw) in TFileStreams.
Bis jetzt habe ich texte (z.b Texturnamen in den Modellen) in eigenem Format
Code:
Meinstring = string[20]
gespeichert. Da die größe des Strings so konstant ist, gibt es natürlich mit dem filestream keine Probleme.
Jetzt wollte ich aber belibig lange strings speichern, und habe das so gelöst:
Code:
// Variablen
x: integer
text: string // beliebiger länge)
f: tfilestream
// Speichervorgang
...
x:=length(text);
f.WriteBuffer(x,sizeof(x));
f.WriteBuffer(text,sizeof(text));
...
// Ladevorgang
...
f.readBuffer(x,sizeof(x));
setlength(text,x);
f.readBuffer(text,sizeof(text));
...
Produziert sehr schöne Programmfehler Habe aber ansonsten am funktionierendem Programmm nichts geändert. Folgender Versuch brachte leider auch keinen Erfolg:
Code:
// Variablen
x: integer
text: string // beliebiger länge)
f: tfilestream
// Speichervorgang
...
x:=sizeof(text);
f.WriteBuffer(x,sizeof(x));
f.WriteBuffer(text,x);
...
// Ladevorgang
...
f.readBuffer(x,sizeof(x));
f.readBuffer(text,x);
...
Lösungsvorschläge??? Oder habe ich nen Fehler gemacht, und eine der Varianten müsste funktionieren?
_________________ Nothing, oh sweet nothing,
today we are doing nothing at all...
http://www.geo-progs.de
Registriert: Di Aug 26, 2003 20:08 Beiträge: 81 Wohnort: Mönchengladbach
Programmiersprache: ObjPas ASM C C++ etc
Strings sind normalerweise immer Ansi-/Longtsrigns, das sind quasi nur Zeiger auf eine Instanz eines Strings. Im Speicher sähe es also so aus:
Code:
–832-Bit-Referenzzähler
–432-Bit-Längenangabe
0..Länge – 1 Zeichen-String
Länge NULL-Zeichen
bzw.
TString=packed record
referencecounter:integer;
stringlength:integer;
stringdata:pchar;
end;
Daher muss man bei WriteBuffer und ReadBuffer es auf das erste Zeichen ansetzen, damit es funktioniert, sonst liest/überscheibst du nur den Stringzeiger selbst. Das ursacht logischereise dann Laufzeitfehler .
so musste es funktionieren:
Code:
// Variablen
x: integer
text: string // beliebiger länge)
f: tfilestream
// Speichervorgang
...
x:=length(text);
f.WriteBuffer(x,sizeof(integer));
if x>0 then f.WriteBuffer(text[1],x);
...
// Ladevorgang
...
f.readBuffer(x,sizeof(integer));
SetLength(text,x);
if x>0 then f.readBuffer(text[1],x);
..
.
_________________ Behindert ist man nicht, behindert wird man.
Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.