Pascal: Datei auf Zeichenfolge untersuchen

Hallo!

Ich habe eine Frage zu Pascal. Wir sollen in einer Aufgabe eine Datei auf einen Virus untersuchen. Die Datei ist vom Typ char.
Gibt es irgendeinen Befehl, wie man diese Datei dann durchsuchen kann? Denn der Befehl pos() ist ja nur für string-Typen gedacht.
Ansonsten würde es mir auch weiterhelfen, wenn mir jemand beantworten könnte, ob man diese char-Datei irgendwie in string umwandeln könnte!

Ich freu mich auf eure Vorschläge!

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