Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Произвести поиск байта или слова в строке

Автор: http://sunsb.dax.ru

У семейства 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.

Проект Delphi World © Выпуск 2002 - 2024
Автор проекта: USU Software
Вы можете выкупить этот проект.