Пятница, 27.12.2024, 05:18 Приветствую вас Гость | Группа "Гости" 
Меню сайта

Категории раздела
Вирусология [40]
Статьи о вирусах
Системные [1]
Работа с системой
Примеры [45]
Приёмы, функции, процедуры
Ceти [1]
Работа с интернет
Шуточные программы [5]
Пишем шуточные программки
Остальное [6]
Всё что не вошло

Популярные статьи

Недавние темы

Опрос
Стоит ли сменить дизайн сайта?
Всего ответов: 444

Главная » Статьи » Delphi » Примеры

Поиск текста в текстовых файлах
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
SpeedButton1: TSpeedButton;
procedure SpeedButton1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;



// Aus einem alten c′t-Heft von C nach Delphi ubersetzt
// Deklarationsteil

procedure Ts_init(P: PChar; m: Integer);
function Ts_Search(Text, p: PChar; m: Integer; Start: Longint): Longint;



// Globale Variablen
// *****************


var

shift: array[0..255] of Byte; // Shifttabelle fur Turbosearch
Look_At: Integer; // Look_At-Position fur Turbosearch



implementation

{$R *.DFM}


procedure Ts_init(P: PChar; m: Integer);
var
i: Integer;
begin
// *** Suchmuster analysieren ****

{1.} for i := 0 to 255 do shift[i] := m + 1;
{2.} for i := 0 to m - 1 do Shift[Ord(p[i])] := m - i;

Look_at := 0;

{3.} while (look_At < m - 1) do
begin
if (p[m - 1] = p[m - (look_at + 2)]) then Exit
else
Inc(Look_at, 1);
end;

// *** Beschreibung ****
// 1. Sprungtabelle Shift[0..255] wird mit der max. Sprungweite (Musterlange+1)
// initialisiert.
// 2. Fur jedes Zeichen im Muster wird seine Position (von hinten gezahlt) in
// der Shift-Tabelle eingetragen.
// Fur das Muster "Hans" wurden folgende Shiftpositionen ermittelt werde:
// Fur H = ASCII-Wert = 72d ,dass von hinten gezahlt an der 4. Stelle ist,
// wird Shift[72] := 4 eingetragen.
// Fur a = 97d = Shift[97] := 3;
// Fur n = 110d = Shift[110] := 2;
// Fur s = 115d = Shift[115] := 1;
// Da das Muster von Vorn nach Hinten durchsucht wird, sind doppelt auf-
// tretende Zeichen kein Problem. Die Shift-Werte werden uberschrieben und
// mit der kleinsten Sprungweite automatisch aktualisiert.
// 3. Untersucht wo (position von hinten) das Letzte Zeichen im Muster
// nochmals vorkommt und Speichert diese in der Variable Look_AT.
// Die Maximale Srungweite beim Suchen kann also 2*Musterlange sein wenn
// das letzte Zeichen nur einmal im Muster vorhanden ist.
end;


function Ts_Search(Text, p: PChar; m: Integer; Start: Longint): Longint;
var
I: Longint;
T: PChar;
begin
T := Text + Start; // Zeiger auf Startposition im Text setzen
Result := -1;
repeat
i := m - 1;
// Letztes Zeichen des Suchmusters im Text suchen.
while (t[i] <> p[i]) do t := t + shift[Ord(t[m])];
i := i - 1; // Vergleichszeiger auf vorletztes Zeichen setzen
if i < 0 then i := 0; // wenn nach nur einem Zeichen gesucht wird,
// kann i = -1 werden.
// restliche Zeichen des Musters vergleichen
while (t[i] = p[i]) do
begin
if i = 0 then Result := t - Text;
i := i - 1;
end;
// Muster nicht gefunden -> Sprung um max. 2*m
if Result = -1 then t := t + Look_AT + shift[Ord(t[m + look_at])];
until Result <> -1; // Repeat
end;

// Such-Procedure auslosen (hier beim drucken eines Speedbuttons auf FORM1)

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
tt: string;
L: Integer;
L2, sp, a: Longint;
F: file; // File-Alias
Size: Integer; // Textlange
Buffer: PChar; // Text-Memory-Buffer
begin
tt := Edit1.Text; // Suchmuster
L := Length(TT); // Suchmusterlange
ts_init(PChar(TT), L); // Sprungtabelle fur Suchmuster initialisieren
try
AssignFile(F, ′test.txt′);
Reset(F, 1); // File offnen
Size := FileSize(F); // Filegrosse ermitteln
GetMem(Buffer, Size + L + 1); // Memory reservieren in der Grosse von
// TextFilelange+Musterlange+1
try
BlockRead(F, Buffer^, Size); // Filedaten in den Buffer fullen
StrCat(Buffer, PChar(TT)); // Suchmuster ans Ende des Textes anhangen
// damit der Suchalgorythmus keine Fileende-
// Kontrolle machen muss.
// Turbo-Search

SP := 0; // Startpunkt der Suche im Text
A := 0; // Anzahl-gefunden-Zahler
while SP < Size do
begin
L2 := Ts_Search(Buffer, PChar(TT), L, SP); // L = Musterlange
// SP= Startposition im Text

SP := L2 + L; // StartPosition auf Letzte gefundene Position+Musterlange
Inc(a); // Anzahl gefunden Zahler
end;
// Am Schluss nicht vergessen Buffer freigeben und Inputfile schliessen
finally
FreeMem(Buffer); // Memory freigeben.
end;
finally
CloseFile(F); // Datei schliessen.
end;
end;

end.
Категория: Примеры | Добавил: dolphin (19.04.2011)
Просмотров: 6971 | Рейтинг: 2.0/1

Всего комментариев: 0
avatar
Профиль



Поиск

Наша кнопка
Вирусология, взгляд из Delphi

Статистика
Top.Mail.Ru Яндекс.Метрика Счетчик тИЦ и PR
Статистика материалов
Файлов: 457
Форум: 1175/8163
Коментариев: 770
Новостей: 29

Статистика пользователей
Всего: 385
За неделю: 0
Вчера: 0
Сегодня: 0
Всего онлайн: 1
Гостей: 1
Пользователей: 0

delphicode.ru © 2008 - 2024 Хостинг от uCoz