Herzlich willkommen in der Delphi-PRAXiS.
Du kannst nach dem Prinzip des
sliding window suchen. Der Beispielcode ist nicht hoch-performant, aber hat dafür didaktische Vorzüge. Es wird nach Leerzeilen gesucht.
Delphi-Quellcode:
uses
Types,
Math;
procedure ProcessMessages;
// hält die Nachrichtenschleife in Gang
var
Msg: TMsg;
begin
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
function LocateHex(s: TStream; hex: TByteDynArray; out iPos: Int64): Boolean;
// gesucht wird ab der aktuellen Position
var
buf: TByteDynArray;
i, iBuf, iGot, iNeed: Integer;
iHave: Int64;
begin
iBuf := Length(hex);
SetLength(buf, iBuf);
iNeed := iBuf;
repeat
iHave := s.Size - s.Position;
iGot := s.Read(buf[iBuf - iNeed], Min(iHave, iNeed));
Result := CompareMem(@buf[0], @hex[0], Length(hex));
iNeed := 1;
Move(buf[iNeed], buf[0], iBuf - iNeed);
ProcessMessages;
until Result or (iGot = 0);
if Result
then iPos := s.Position - iBuf
else iPos := -1;
end;
procedure TDemoForm.Button2Click(Sender: TObject);
var
iPos: Int64;
bda: TByteDynArray;
fs: TFileStream;
fn: TFileName;
st: String;
begin
// gesucht wird eine Leerzeile
st := #13#10#13#10;
SetLength(bda, Length(st));
Move(st[1], bda[0], Length(st));
fn := ChangeFileExt(ParamStr(0), '.dpr');
fs := TFileStream.Create(fn, fmOpenRead or fmShareDenyNone);
while LocateHex(fs, bda, iPos) do
begin
ShowMessage(IntToStr(iPos));
fs.Position := fs.Position - 2;
end;
fs.Free;
end;
Freundliche Grüße vom marabu