Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск по файлу [D7, WinXP]


Страницы:   1 2 3

lmz ©   (2005-05-23 20:17:00) 

Алгоритм поиска по файлу: например, есть какой то файл, в нём написан какой-то текст, необходимо найти некоторые слова и вывести результаты поиска?


Viktop   (2005-05-25 04:50:00) [1]

Ну ведь можно добавить:
For i:=index to length(str1) do begin
  if copy(str1,i,len)=str2 then begin
    pos:=i;
    Inc(numder)
  end;

А зачем поиск должен приостанавливаться?


Defunct   (2005-05-24 20:55:00) [2]

Viktop   (24.05.05 20:23) [41]

Функция ищет не количество подстрок, а позицию подстроки в файле. При этом в отличие от Pos поиск не приостанавливается на служебных символах #0 и т.п. Изначально функция [22] была предназначена для поиска подстрок в бинарном файле.


Viktop   (2005-05-24 20:23:00) [3]

to Defunct
Пост 31

P.S.: Я, кажется простое решение нашёл:
function InStr(index: integer; str1: string; str2: string): integer;
var
 i,len, pos: integer;
begin
 pos:=0;
 len:=length(str2);
 for i:=index to length(str1) do begin
   if copy(str1,i,len)=str2 then begin
     pos:=i;
     break; // здесь можно писать свои условия
   end;
 end;
 result:=pos;
end;


Параметры функции:
номер символа, с которго ищем, в какой строке ищем, что ищем


lmz   (2005-05-24 18:07:00) [4]


> в файле 1Г

Почему 1Г, размер файла может быть от 2 метров до 50 метров...


Defunct   (2005-05-24 17:16:00) [5]

Viktop   (24.05.05 17:09) [38]

> А глюки с поиском

Подробнее про глюки плз. т.к. не замечал глюков именнов в этих функциях.


Viktop   (2005-05-24 17:09:00) [6]

to Defunct
А глюки с поиском Вы не замечали (кол-во найденного)?


Defunct   (2005-05-24 17:07:00) [7]

lmz ©   (24.05.05 15:22) [30]

Вам не нужно использовать непосредственно ASM функцию. Вам достаточно использовать как в примере, функцию ConstantExists, которая возвращает позицию искомой константы в файле.


Viktop   (2005-05-24 16:52:00) [8]

to nikkie
А ты попробуй скорми этим функция файл с парой строк и поэксперементируй. Я бы потправил, но знания asma=0,00001% (знаю что что-то там про регистры есть)


ANB   (2005-05-24 16:38:00) [9]


> Не то получается, наример есть какая-то база, возьмём телефоный
> справочник, в этом файле записаны фамилии,
- имхо, ты хочешь движок БД написать ? Опять таки, имхо, проще тогда готвую СУБД использовать. В них есть поиск по индексу. А поиск перебором в файле 1Г по любому медленно работать будет.


Alx2   (2005-05-24 16:30:00) [10]

>lmz ©   (24.05.05 16:15)

Сам в массиве можешь заданную цепочку найти?


nikkie   (2005-05-24 16:28:00) [11]

чужой код - он такой. никогда не работает, как надо.


lmz   (2005-05-24 16:15:00) [12]

Вот и я про тоже...


Viktop   (2005-05-24 16:01:00) [13]

Как-то странно работаю эти функции :(. Сначала выдавала на 1 найденый элемент больше. Потом стала выдавать числа за 1000, хотя в файле 100 слов максимум. Далее: В файл поместил 5 одинаковых строк - число найденных = 1


lmz   (2005-05-24 15:22:00) [14]


> function ConstantPos(const Constant: string;
>         Buffer: Pointer; BufSize: Integer): Integer; Assembler;
> asm
>  Push EDi
>  Push ESi
>  Push EBx
>  Push EBp
>  Push ECx            // store total buffer size for later
> calculation pos
>  MOV  ESI, EAX       // ESi pointer to constant
>  Mov  EDi, EDx       // EDi pointer to buffer
>  Mov  EBX, [ESI-4]
>  Dec  EBX
>  Mov  Ah, [ESi+EBx]  // Store last char of the constant
> in AH
>  Dec  EBx            // EBx - length of the constant w/o
> 1st and last chars
>  Mov  Al, [ESi]      // Store first char of the constant
> in AL
>  Mov  EDx,ECx        // EDx - Stored residual buffer size
>  Inc  ESi
>  Mov  EBp, ESi       // EBp - stored pointer to 2nd char
> of constant
>
> @@Scan:
>  Repne ScasB
>  JNE   @@Exit_False  // no 1st char of the constant found
> = exit_false
>  Mov   EDx, ECx      // store new residual buffer size
>  Cmp   EDx, EBx      // constant still can be settled in
> buffer
>  Ja    @@CheckLastChar  // no - exit with false result
>
> @@Exit_False:
>  Pop  EAx
>  Xor  EAx,EAx        // False = (0), check delphi help for
> more info
>  Dec  EAx
>  Jmp  @@Leave_Proc
>
> @@CheckLastChar:      // as proposed in Boyer-Mur alhorithm
>
>  Cmp   Ah, [EDi+EBx] // check found substring with last
> char of the constant
>  Jnz   @@Scan        // not match - continue searching
>
> @@CompareWholeString:
>  Mov  ECx, Ebx       // ECx - constant chars amount
>  Repe CmpsB
>  Jz   @@Constant_Exists
>  Mov  ESi, EBp       // restore pointer to 2nd char of constant
>  Add  EDx, ECx
>  Sub  EDx, EBx       // correct residual buffer size
>  Mov  ECx, EDx       // restore residual buffer size to
> ECx
>
>  Jnz  @@Scan
>
> @@Constant_Exists:
>  Pop  EAx
>  Sub  EAx, EDx
>
> @@Leave_Proc:
>
>  Pop  EBp
>  Pop  EBx
>  Pop  ESi
>  Pop  EDi
> end;


Как использовать эту функцию? Что передавать в параметры Buffer и BufSize?


lmz   (2005-05-24 15:17:00) [15]


> уже исправил

Не  исправил...


Игорь Шевченко   (2005-05-24 15:14:00) [16]


> Не то получается


Надеюсь, ты уже исправил данный тебе (даром!) код, так, чтобы он работал в соответствии с твоими требованиями ?


Viktop   (2005-05-24 15:05:00) [17]

Посмотреть бы на эти [74] и [87]


lmz   (2005-05-24 14:59:00) [18]

Во всяком случае, у меня получилось не так, тут число получается...


Viktop   (2005-05-24 14:54:00) [19]

А здесь что не так?


lmz   (2005-05-24 14:52:00) [20]

Не то получается, наример есть какая-то база, возьмём телефоный справочник, в этом файле записаны фамилии, номера, адреса, мне надо, чтобы при вводе какой-то фамилии выводились все похожие?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо