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