Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2013, 11:17   #1
Parnischa55
 
Регистрация: 13.02.2013
Сообщений: 9
По умолчанию Delphi: Поиск слова в нескольких текстовых файлах.

Здравствуйте уважаемые форумчане.
Помогите пожалуйста решить одну задачу.

Есть несколько текстовых файлов. Нужно найти слово введенное в Edit. В случае нахождения этого слова в файле указать путь к этому файлу.

Я конечно понимаю что на форму нужно кинуть компоненты: Memo (или RichEdit), Edit, Button, и Label (для вывода пути). И я так думаю нам нужно будет два цикла, первый для перебора и загрузки файлов, второй для перебора строк.
Но я не знаю как правильно это организовать програмно!
Помогите пожалуйста!
За ранее спасибо!
Parnischa55 вне форума Ответить с цитированием
Старый 13.02.2013, 11:36   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Функа поиска в файле:
Код:
function FindInFile(Filename,aWord:String):Boolean;
begin
 with TStringList.Create do begin
  LoadFromFile(Filename);
  Result:=pos(aWord,Text)<>0;
  Free;
 end;
end;
Ее юзанье:
Код:
if FindInFile('c:\file.txt','Hello world') then ShowMessage('Слово есть в c:\file.txt');
Идея понятна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.02.2013, 11:38   #3
Parnischa55
 
Регистрация: 13.02.2013
Сообщений: 9
По умолчанию

Идея понятна. Буду пробовать.
Спасибо!

Я думаю тут еще надо добавить else

<code> if FindInFile('c:\file.txt','Hello world') then ShowMessage('Слово есть в c:\file.txt') else ;</code>

Еще один вопрос.
Как записать первую строку текстового файла в переменную?

Последний раз редактировалось Stilet; 13.02.2013 в 15:48.
Parnischa55 вне форума Ответить с цитированием
Старый 13.02.2013, 12:27   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Как записать первую строку текстового файла в переменную?
смотря как Вы файл открываете..

если взять код Stilet за основу, тогда:
Код:
function FindInFile(Filename,aWord:String):Boolean;
var s : string;
begin
 with TStringList.Create do begin
   LoadFromFile(Filename);
   if Count>0 then s := Strings[0] {взяли первую строку из файла в переменную s}
   else s := ''; {если в файле нет вообще строк...}

   ....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.02.2013, 12:50   #5
Parnischa55
 
Регистрация: 13.02.2013
Сообщений: 9
По умолчанию Доработка

Возникла проблема
Искомое слово находится в обоих файлах, а цикл сбрасывается после первого нахождения, либо просто второй раз не выводится в лист бокс

Код:
var
  Form1: TForm1;
  s : string;
implementation

{$R *.dfm}

function FindInFile(Filename,aWord:String):Boolean;
begin
 with TStringList.Create do begin
  LoadFromFile(Filename);
  Result:=pos(aWord,Text)<>0;
  Free;
 end;
end;
 function FindInFile1(Filename,aWord:String):Boolean;

begin
 with TStringList.Create do begin
   LoadFromFile(Filename);
   if Count>0 then s := Strings[0] {âçÿëè ïåðâóþ ñòðîêó èç ôàéëà â ïåðåìåííóþ s}
   else s := ''; {åñëè â ôàéëå íåò âîîáùå ñòðîê...}
   end;   end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Clear   ;
if FindInFile('c:\file.txt', edit1.Text) then
begin
FindInFile1('c:\file.txt','1') ;
ListBox1.Items.Add(s)   ;
ShowMessage('????? ???? ? c:\file.txt') end   else
if FindInFile('c:\file2.txt', edit1.Text) then begin
FindInFile1('c:\file2.txt','1') ;
ListBox1.Items.Add(s)   ;

 ShowMessage('????? ???? ? c:\file2.txt');
  end ;
end;

end.


_________________
теги [ CODE ] [ / CODE ] - должны быть БЕЗ пробелов внутри!
А ещё удобно выделить код программы и нажать на кнопку форматирования сообщения
на форме, на которой нарисован знак #

Модератор.

Последний раз редактировалось Serge_Bliznykov; 13.02.2013 в 13:02.
Parnischa55 вне форума Ответить с цитированием
Старый 13.02.2013, 13:00   #6
Parnischa55
 
Регистрация: 13.02.2013
Сообщений: 9
По умолчанию

Все таки проблема в цикле.
Как правильно организовать цикл чтобы он продолжал поиск после первого нахождения?
Parnischa55 вне форума Ответить с цитированием
Старый 13.02.2013, 13:05   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

код, конечно, жуткий. Например, абсолютно непонятно, зачем Вы ДВАЖДЫ читаете каждый файл? Одного раза более чем достаточно.

А во-вторых, что у Вас не работает?! Какой цикл?! Ткните меня в те строчки кода, которые Вы называете циклом?!


Цитата:
Как правильно организовать цикл чтобы он продолжал поиск после первого нахождения?
во-первых, у Вас в программе никакого цикла вообще нет.
А во-вторых, что Вам нужно сделать? Как задание формулируется изначально?

Последний раз редактировалось Serge_Bliznykov; 13.02.2013 в 13:09.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.02.2013, 13:12   #8
Parnischa55
 
Регистрация: 13.02.2013
Сообщений: 9
По умолчанию

Ошибки как таковой не возникает. Программа компелируется.
Искомое слово в обоих файлах, просто как только слово встречается в первом файле цикл останавливается, я это понял т.к. второе диалоговое окно не выскакивает.
Если есть другие варианты кода то помогите.

Все понял, у меня условие а не цикл. Извеняюсь

Ура) Получилось благодаря общим усилиям! Спасибо всем большое
Код:
var
  Form1: TForm1;
  s : string;
implementation

{$R *.dfm}

function FindInFile(Filename,aWord:String):Boolean;
begin
 with TStringList.Create do begin
  LoadFromFile(Filename);
  Result:=pos(aWord,Text)<>0;
  Free;
 end;
 with TStringList.Create do begin
   LoadFromFile(Filename);
   if Count>0 then s := Strings[0] 
   else s := '';
   end;
end;

   procedure TForm1.Button1Click(Sender: TObject);
   Var
   i: integer;
begin
ListBox1.Items.Clear   ;
ListBox1.Items.Add('Результат поиска')   ;
for i:=1 to 2 do
if FindInFile('c:\file'+FloatToStr(i)+'.txt', edit1.Text) then
ListBox1.Items.Add(s)
end;
Вот как то так.

Последний раз редактировалось Stilet; 13.02.2013 в 15:55.
Parnischa55 вне форума Ответить с цитированием
Старый 13.02.2013, 13:50   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

О! НЕТ!!!

Код:
function FindInFile(Filename,aWord:String):Boolean;
begin
 with TStringList.Create do begin
  LoadFromFile(Filename);
  Result:=pos(aWord,Text)<>0;
  if Count>0 then s := Strings[0] 
  else s := '';
  Free;
 end;
не надо ДВАЖДЫ читать файл, тем более, чтобы взять в нём первую строку!!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.02.2013, 13:52   #10
Parnischa55
 
Регистрация: 13.02.2013
Сообщений: 9
По умолчанию

Serge_Bliznykov Большое спасибо за поправку.
Parnischa55 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль, сортировка в текстовых файлах. Monori Помощь студентам 4 11.04.2012 17:59
Сравнение данных в текстовых файлах zhukovms Помощь студентам 34 05.09.2011 11:58
Быстрый поиск в больших текстовых файлах RIO Общие вопросы Delphi 6 29.04.2011 15:46
Поиск и замена в текстовых файлах akm-gala Помощь студентам 1 18.06.2010 09:08
Программа для скрытия информации с графических и текстовых файлах (Delphi\C++) Ferrat Помощь студентам 12 04.05.2009 04:25