2007. október 2., kedd

Fastest way to search a string in a file


Problem/Question/Abstract:

Fastest way to search a string in a file

Answer:

The function below returns position of substring in file, or -1 if such substring can not be found.


function PosInFile(Str, FileName: string): integer;
var
  Buffer: array[0..1023] of char;
  BufPtr, BufEnd: integer;
  F: file;
  Index: integer;
  Increment: integer;
  c: char;

  function NextChar: char;
  begin
    if BufPtr >= BufEnd then
    begin
      BlockRead(F, Buffer, 1024, BufEnd);
      BufPtr := 0;
      Form1.ProgressBar1.Position := FilePos(F);
      Application.ProcessMessages;
    end;
    Result := Buffer[BufPtr];
    Inc(BufPtr);
  end;

begin
  Result := -1;
  AssignFile(F, FileName);
  Reset(F, 1);
  Form1.ProgressBar1.Max := FileSize(F);
  BufPtr := 0;
  BufEnd := 0;
  Index := 0;
  Increment := 1;
  repeat
    c := NextChar;
    if c = Str[Increment] then
      Inc(Increment)
    else
    begin
      Inc(Index, Increment);
      Increment := 1;
    end;
    if Increment = (Length(Str) + 1) then
    begin
      Result := Index;
      Break;
    end;
  until BufEnd = 0;
  CloseFile(F);
  Form1.ProgressBar1.Position := 0;
end;

Nincsenek megjegyzések:

Megjegyzés küldése