Hallo,
ich habe es nur in Delphi probiert, aber für Pascal sollte fast genauso aussehen:
// Gesucht wird das erste Vorkommen der Zeichenkette 'SearchStr'
// in der Datei mit dem Namen 'Filename'
// Der Rückgabewert ist -1, wenn SearchStr nicht gefunden wurde,
// ansonsten ist es die Position des ersten Zeichens von
// SearchStr in der Datei
function PosInFile(const SearchStr,Filename:String):Integer;
var
F: File of Char;
p: Integer; // Zeichen-Position in der Datei
i: Integer; // Index für die Zeichenposition in SearchStr
c: Char; // aktuelles Zeichen
begin
Result := -1;
assignFile(F, Filename);
Reset(F);
try
p := 0;
repeat
Inc(p);
Read(F, c);
i := 1;
while (c = SearchStr[i]) and (Result = -1) and not(EOF(F)) do
begin
Inc(i);
Read(F, c);
If i = Length(SearchStr) then Result := p-1;
end;
until EOF(F) or (Result \>= 0);
finally
closeFile(F);
end;
end;
Das ist eine sehr einfache Lösung. Sie ist „relativ“ flott, allerdings ist es bei SEHR großen Dateien möglich, dass man besser erst größere Blöcke als Zeichenkette einliest („BlockRead()“) und diese dann nach dem Vorkommen des Suchtextes durchsucht. Dabei muss man darauf achten, den jeweils folgenden Block um die Länge des Suchtextes mit dem vorigen Block überlappen zu lassen, für den Fall, dass der Suchtext über die Grenze zweier Blöcken hinweg steht.
Hier (in Delphi) ein Anwendungsbeispiel:
procedure TForm1.Button1Click(Sender: TObject);
const
Datei = 'C:\Windows\Clock.avi';
Suche = 'Microsoft';
var
P: Integer;
begin
P := PosInFile(Suche, Datei);
if P \>= 0 then
ShowMessage(Format('Zeichenfolge "%s" gefunden in Datei "%s" bei Position %d.',
[Suche, ExtractFilename(Datei), P]))
else
ShowMessage(Format('Zeichenfolge "%s" nicht gefunden in Datei "%s".',
[Suche, ExtractFilename(Datei)]))
end;
LG
Jochen