Einzelnen Beitrag anzeigen

Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#1

bei string in TFileStream kommt 1 Zeichen zu wenig an...

  Alt 22. Mär 2010, 21:50
Hi!
Ich habe gerade ein Problem mit einem TFileStream:

Ich würde gerne folgendes Konstrukt in einen FileStream schreiben:
Delphi-Quellcode:
type
  TTitel=record
    Pfad:string[255];
    Titel:string[255];
    Name:string[255];
    Interpret:string[255];
    Jahr:string[255];
    Album:string[255];
    Genre:string[255];
    Laenge:string[255];
    Kommentar:string[255];
  end;

  TTitelListe=array of TTitel;
Das wollte ich so Abspeichern und wieder Laden:
Delphi-Quellcode:
procedure TForm1.Save(path: string);
var f:TFileStream;
    x,y:integer;
begin
  f:=TFileStream.Create(path,fmcreate);
  f.WriteBuffer(High(AllTitel),SizeOf(integer));
  for x:=0 to High(AllTitel) do
  begin
    y:=Length(AllTitel[x].Titel);
    f.WriteBuffer(y,SizeOf(integer));
    f.WriteBuffer(AllTitel[x].Titel,Length(AllTitel[x].Titel));

    y:=Length(AllTitel[x].Name);
    f.WriteBuffer(y,SizeOf(integer));
    f.WriteBuffer(AllTitel[x].Name,Length(AllTitel[x].Name));

    y:=Length(AllTitel[x].Pfad);
    f.WriteBuffer(y,SizeOf(integer));
    f.WriteBuffer(AllTitel[x].Pfad,Length(AllTitel[x].Pfad));

    y:=Length(AllTitel[x].Genre);
    f.WriteBuffer(y,SizeOf(integer));
    f.WriteBuffer(AllTitel[x].Genre,Length(AllTitel[x].Genre));

    y:=Length(AllTitel[x].Interpret);
    f.WriteBuffer(y,SizeOf(integer));
    f.WriteBuffer(AllTitel[x].Interpret,Length(AllTitel[x].Interpret));

    y:=Length(AllTitel[x].Jahr);
    f.WriteBuffer(y,SizeOf(integer));
    f.WriteBuffer(AllTitel[x].Jahr,Length(AllTitel[x].Jahr));

    y:=Length(AllTitel[x].Kommentar);
    f.WriteBuffer(y,SizeOf(integer));
    f.WriteBuffer(AllTitel[x].Kommentar,Length(AllTitel[x].Kommentar));

    y:=Length(AllTitel[x].Laenge);
    f.WriteBuffer(y,SizeOf(integer));
    f.WriteBuffer(AllTitel[x].Laenge,Length(AllTitel[x].Laenge));

    y:=Length(AllTitel[x].Album);
    f.WriteBuffer(y,SizeOf(integer));
    f.WriteBuffer(AllTitel[x].Album,Length(AllTitel[x].Album));
  end;
  f.Free;
end;

procedure TForm1.Load(path: string);
var f:TFileStream;
    x,y,z:integer;
    s:string;
begin
  f:=TFileStream.Create(path,fmOpenRead);
  f.Position:=0;
  f.ReadBuffer(y,SizeOf(integer));
  SetLength(AllTitel,y+1);
  for x:=0 to y do
  begin
    f.ReadBuffer(z,sizeof(integer));
    f.ReadBuffer(AllTitel[x].Titel,z);

    f.ReadBuffer(z,sizeof(integer));
    f.ReadBuffer(AllTitel[x].Name,z);

    f.ReadBuffer(z,sizeof(integer));
    f.ReadBuffer(AllTitel[x].Pfad,z);

    f.ReadBuffer(z,sizeof(integer));
    f.ReadBuffer(AllTitel[x].Genre,z);

    f.ReadBuffer(z,sizeof(integer));
    f.ReadBuffer(AllTitel[x].Interpret,z);

    f.ReadBuffer(z,sizeof(integer));
    f.ReadBuffer(AllTitel[x].Jahr,z);

    f.ReadBuffer(z,sizeof(integer));
    f.ReadBuffer(AllTitel[x].Kommentar,z);

    f.ReadBuffer(z,sizeof(integer));
    f.ReadBuffer(AllTitel[x].Laenge,z);

    f.ReadBuffer(z,sizeof(integer));
    f.ReadBuffer(AllTitel[x].Album,z);
    if (AllTitel[x].Titel[1]<>'') then
      s:=AllTitel[x].Interpret+' / '+AllTitel[x].Titel
    else s:=AllTitel[x].Name;
    LBSammelung.Items.Add(s);
  end;
  f.Free;
end;
Nun, in der Datei kommt alles richtig an außer das bei jedem string das letzte Zeichen fehlt.
Woran liegt das?

Gruß Teekeks
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat