Я публикую пример того, как я буду писать и читать файл записей, используя потоки, и искать в нем определенный текст ANSI. Вы также можете проверить commented version
этого сообщения.
Вот определение записи, использованное в этом примере:
type
TFileRecord = packed record
Marker: array [0..4] of Byte;
Width: Integer;
Height: Integer;
Useful: Boolean;
end;
Вот как создать такой файл записей (что у вас уже есть:)
procedure TForm1.Button1Click(Sender: TObject);
var
FileStream: TFileStream;
FileRecord: TFileRecord;
const
RecordSize = SizeOf(TFileRecord);
procedure FillFileRecord(const AMarker: string; const AWidth: Integer;
const AHeight: Integer; const AUseful: Boolean);
begin
FillChar(FileRecord, RecordSize, 0);
Move(AMarker[1], FileRecord.Marker, Length(FileRecord.Marker));
FileRecord.Width := AWidth;
FileRecord.Height := AHeight;
FileRecord.Useful := AUseful;
end;
begin
FileStream := TFileStream.Create('File.dat', fmCreate);
try
FillFileRecord('FILE1', 111, 112, False);
FileStream.Write(FileRecord, RecordSize);
FillFileRecord('FILE2', 211, 212, False);
FileStream.Write(FileRecord, RecordSize);
FillFileRecord('FILE3', 311, 312, False);
FileStream.Write(FileRecord, RecordSize);
FillFileRecord('FILE4', 411, 412, False);
FileStream.Write(FileRecord, RecordSize);
FillFileRecord('FILE0', 666, 777, True);
FileStream.Write(FileRecord, RecordSize);
FillFileRecord('FILE5', 511, 512, False);
FileStream.Write(FileRecord, RecordSize);
FillFileRecord('FILE0', 11111, 22222, True);
FileStream.Write(FileRecord, RecordSize);
FillFileRecord('FILE6', 611, 612, False);
FileStream.Write(FileRecord, RecordSize);
finally
FileStream.Free;
end;
end;
А вот как читать такой файл:
procedure TForm1.Button2Click(Sender: TObject);
var
FileStream: TFileStream;
FileRecord: TFileRecord;
const
HeaderSeq = 'FILE0';
HeaderLen = Length(HeaderSeq);
RecordSize = SizeOf(TFileRecord);
begin
FileStream := TFileStream.Create('File.dat', fmOpenRead);
try
while FileStream.Read(FileRecord, RecordSize) = RecordSize do
begin
if CompareMem(@HeaderSeq[1], @FileRecord.Marker[0], HeaderLen) then
begin
Memo1.Lines.Add('FILE0 entry found at '+
IntToStr(FileStream.Position - RecordSize));
Memo1.Lines.Add('FileRecord.Width = ' +
IntToStr(FileRecord.Width));
Memo1.Lines.Add('FileRecord.Height = ' +
IntToStr(FileRecord.Height));
Memo1.Lines.Add('FileRecord.Useful = ' +
BoolToStr(FileRecord.Useful, True));
end;
end;
finally
FileStream.Free;
end;
end;