Musst du die Datei bloss einlesen oder muss die Datei später auch verändert geschrieben werden?
Falls die Datei nur gelesen werden muss, könntest du Dir viel Arbeit sparen, wenn du eine Adapterklasse einsetzt.
Hier mal als Vergleich zwischen deiner alten Technik und meinem neuen Vorschlag:
Delphi-Quellcode:
Read(ds.FileID,sizeof(word)); // ALT
ds.FileID := h.ReadWord; // NEU
// ALT - 3 Zeilen
Read(ds.string_length_comment[i],sizeof(word));
Setlength(ds.string_comment[i], ds.string_length_comment[i]);
Read(ds.string_comment[i][1],ds.string_length_comment[i]);
// NEU - nur eine Zeile
ds.string_length_comment[i] := h.ReadShortString;
Beim Einlesen eines Words ist der Unterschied noch recht gering,
aber beim Einlesen von den Strings zeigt sich doch, dass die neue Technik viel angenehmer ist.
Ausserdem kannst du Dir damit sämtliche Längenangaben in dem Record sparen
und dich voll auf die Nutzdaten konzentrieren.
Hier wäre mal die Deklaration der Adapterklasse:
Delphi-Quellcode:
TStreamAdapter = class(TObject)
protected
FStream : TStream;
public
constructor Create(AStream:TStream;AOwnsStream: Boolean = False);
destructor Destroy;override;
function ReadBoolean: Boolean;
function ReadChar: Char;
function ReadCurrency: Currency;
function ReadDateTime: TDateTime;
function ReadDouble: Double;
function ReadExtended: Extended;
function ReadInt64: Int64;
function ReadInteger: Integer;
function ReadCString: string;
function ReadShortString: string;
function ReadSingle: Single;
function ReadSizedString: string;
function ReadWord:Word;
procedure WriteBoolean(Value: Boolean);
procedure WriteChar(Value: Char);
procedure WriteCurrency(const Value: Currency);
procedure WriteDateTime(const Value: TDateTime);
procedure WriteDouble(const Value: Double);
procedure WriteExtended(const Value: Extended);
procedure WriteInt64(Value: Int64); overload;
procedure WriteInteger(Value: Integer); overload;
procedure WriteStringDelimitedByNull(const Value: string);
procedure WriteShortString(const Value: ShortString);
procedure WriteSingle(const Value: Single);
procedure WriteSizedString(const Value: string);
procedure WriteWord(const Value:Word);
end;
Bei Interesse kann ich dir noch mehr zu der Adapterklasse schreiben.