![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск по файлу [D7, WinXP]
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]Не то получается, наример есть какая-то база, возьмём телефоный справочник, в этом файле записаны фамилии, номера, адреса, мне надо, чтобы при вводе какой-то фамилии выводились все похожие?