Ich will eine Datei auslesen.
Dafür habe folgenden Code:
Inhalt der Datei:
02 00 00 00 01 00 <ID 21 A1 07 00> <Stringlänge 00 13> 00 <string>
<ID> <Stringlänge> 00 <string>
<ID> <Stringlänge> 00 <string>
etc...
Delphi-Quellcode:
fs.Seek(6,0); //Die ersten Bytes überspringen
fs.Read(id, 4);
fs.Seek(1, 1); //Ein byte überspringen (gibt es ne bessere lösung?)
fs.Read(Len, 2);
SetLength(text, Len);
fs.Read(PChar(text)^, Len);
//daten[i].id := id;
//daten[i].text := text;
DIe Daten will ich in dieses Array:
Delphi-Quellcode:
type
TDatensatz = record
ID: integer;
Text: AnsiString;
end;
TDatenArray = array of TDatensatz;
Und das ist mein versuch der imemr irgnedwleche Speicherzugriffsfehler auswirft und das Programm crasht:
Delphi-Quellcode:
procedure TForm1.ReadData(datei : string; var daten : TDatenArray );
var
fs : TStream;
i, id, Len : Integer;
text : string;
begin
fs := TFileStream.Create(datei, fmOpenReadWrite);
fs.Seek(6,0);
i := 0;
while fs.Position < fs.Size do
begin
inc(i);
SetLength( daten, i );
fs.Read(id, 4);
fs.Seek(1, 1); //Will ich weg haben
fs.Read(Len, 2); //Wieso nur 2 bytes?
SetLength(text, Len);
fs.Read(PChar(text)^, Len);
daten[i].id := id;
daten[i].text := text;
//Immerhin funktionniert die schleife überhaupt erst mit der folgenden Zeile. *schulterzuck*
//Ohne diel iest er nur den ersten eintrag.
ListBox.Items.Add( IntToStr(fs.Position) +'<'+IntToStr(fs.Size) );
end;
fs.Free;
end;
Wie kann ich das ganze eleganter lösen?