Произвести поиск байта или слова в строке
Материал из DRKB
Произвести поиск байта или слова в строке[править | править код]
У семейства x86 есть группа специализированных строковых инструкций, одна из которых - scasb/scasw - производит поиск байта/слова в строке. Использовать преимущества этой инструкции в Delphi позволяют длинные строки, которых в старых паскалях не было.
Никаких сложностей с пониманием, на мой взгляд, быть не должно. Единственное это смена режима открытия файла (FileMode := 0), которая позволит открыть файлы заблокированные ядром Windows и сдвиг указателя файла при чтении нового блока влево на длину искомой строки. Сдвиг делается на случай разрезания искомой строки на части при чтении файла. Полный текст проверенной программы:
program search;
{$APPTYPE CONSOLE}
uses SysUtils;
const buffSize = 16384;
var F : File;
var buff : AnsiString;
var oldFileMode : integer;
var SearchString: shortString='SunSB';
var SearchPos : integer = -1;
var readed : integer;
var blockStart: integer;
begin
SetLength(buff, buffSize);
AssignFile(F, 'Speedometer2.exe');
oldFileMode := FileMode;
FileMode := 0;
Reset(F, 1);
while not Eof(F) do
begin
blockStart := filePos(F);
BlockRead(F, buff[1], buffSize, readed);
SearchPos := Pos(SearchString, buff);
if SearchPos > 0 then
begin
WriteLn('Substr found at pos ', blockStart + SearchPos );
break;
end;
if readed = buffSize then
Seek(F, (FilePos(F) - Length(SearchString)));
end;
CloseFile(F);
FileMode := oldFileMode;
SetLength(buff, 0);
if SearchPos = 0 then
WriteLn('Substr not found.');
ReadLn();
end.
Source: http://sunsb.dax.ru