Hallo,
ersteinmal mein Code:
Delphi-Quellcode:
procedure TTeTrades.SaveToFile;
var
f: TFileStream;
str_size, i: Integer;
d: TTeStaticValues;
name: String;
begin
header.count := data.Count;
f := TFileStream.Create(FConfig.folders.tradesdata + '\' + string(header.name) + '.te', fmCreate);
//Header schreiben
f.Write(header,SizeOf(header));
//Daten schreiben
for i := 0 to data.Count-1 do
begin
d := data[i].stat;
f.Write(d,SizeOf(d));
if (d.item_id = 0) then
begin
//Name schreiben wenn CustomItem
name := data[i].name;
str_size := Length(name);
f.Write(str_size, SizeOf(str_size));
f.Write(name[1],2*str_size); // <---- WICHTIG
end;
end;
f.Free;
end;
procedure TTeTrades.LoadFromFile;
var
f: TFileStream;
i: Integer;
name: String;
str_size: Integer;
s: TTeStaticValues;
begin
data.Clear;
f := TFileStream.Create(FConfig.folders.tradesdata + '\' + string(header.name) + '.te', fmOpenRead);
//Header lesen
f.Read(header,SizeOf(header));
//Daten lesen
for i := 0 to header.count -1 do
begin
name := '';
f.Read(s,SizeOf(s));
if s.item_id = 0 then
begin
//Name lesen wenn CustomItem
f.Read(str_size,SizeOf(str_size));
SetLength(name,str_size);
f.Read(name[1],str_size);
end;
Add(name,s);
end;
f.Free;
end;
Ich stand vor dem Problem, dass ich unter bestimmten Umständen einen String (mit unbekannter Länge) abspeichern muss. Dies habe ich gemacht und mich dann gewundert, warum beim Laden immer nur der halbe String korrekt war und der hintere Teil komische Zeichen enthielt. Also habe ich ein wenig rumprobiert und am Ende einfach die Zeile
f.Write(name[1],str_size);
die in meinen Augen total logisch ist zu
f.Write(name[1],2*str_size);
geändert. Danach hat alles funktioniert. Die Frage ist nur, warum da der Faktor 2 enthalten sein muss, da ich ihn beim Auslesen ja in keinster Weise brauche.
Ich würde das einfach gern verstehen, um Folgefehler zu vermeiden. Deshalb schonmal 10000 Dank im Voraus
Delphi Version : XE8
Debug 32Bit
EDIT: Eine Sache funktioniert leider nicht gut:
Beinhaltet der String Sonderzeichen bekomme ich Probleme.
Mein Test:
String: Text mit Leerzeichen und Sôndérzèichen°
Binäre Datei mit Editor geöffnet beinhaltet:
Code:
std ' T e x t m i t L e e r z e i c h e n u n d S ô n d é r z è i c h e n °
Geladen wird allerdings 'Text mit Leerzeichen'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'e '
Das heißt für mich: Das speichern der Sonderzeichen geht, das laden aber nicht.. warum?