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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2010, 02:05   #1
mental
Пользователь
 
Регистрация: 07.01.2009
Сообщений: 36
По умолчанию работа с файлами

Есть 2 текстовых файла, информация вида:
1 файл: 2 файл:
1 ------ dffs
2 ------ sf32
3 ------ 32fg
4 ------ итд
5 ------ итд
6 ------ итд
7 ------ итд
8 ------ итд
...
999 ------ итд
1000 ------ итд
....
823423 ------ итд


Вообщем суть пробегаем по файлу 1 и находим строку, которая равна строке в Edit'e. Нужно чтобы когда нашлась строка в 1 файле, вывелась соответствующая запись из 2-ого. (наприме ищеться цифра 3, выводится '32fg' ) Я так понимаю нужно определять позицию строки или как вообще можно организовать?

Код:
begin
assignfile(file1_,'C:\aa\5a_1.dat');
reset(file1_);
while not eof(file1_) do 
 begin
   readln(file1_,text);
   if text=Edit3.Text then showMessage('Нашли! и вывести строку из второго файла');
 end;
closefile(file1_)
end;

Последний раз редактировалось mental; 27.01.2010 в 02:08.
mental вне форума Ответить с цитированием
Старый 27.01.2010, 02:23   #2
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Если файлы не очень большие, то можно обойтись функционалом класса TStringList из модуля Classes (не очень быстрый способ):
Код:
var
  File1, File2 : TStrings;
  Index : Integer;
begin
  File1 := TStringList.Create;
  File2 := TStringList.Create;
  try
    File1.LoadFromFile( путь к файлу №1 );
    File2.LoadFromFile( путь к файлу №2 );
    Index := File1.IndexOf( Edit1.Text );
    if ( Index >= 0 ) and ( Index < File2.Count ) then
      ShowMessage( File2[ Index ] );
  finally
    File1.Free;
    File2.Free;
  end;
end;
Если же файлы большого размера, то делаем как в твоем варианте:

Код:
var
  File1, File2 : Text;
  Str1, Str2 : String;
  StringFound : Boolean;
begin  
  StringFound := False;
  AssignFile( File1, путь к файлу #1 ); 
  AssignFile( File2, путь к файлу #2 );
  try
    Reset( File1 ); Reset( File2 );
    while not ( Eof( File1 ) or Eof( File2 ) ) do
    begin
      ReadLn( File1, Str1 ); ReadLn( File2, Str2 );
      if ( Str1 = Edit1.Text ) then
        begin
          StringFound := True;
          Break;
        end;
    end;
  finally
    CloseFile( File1 );
    CloseFile( File2 );
  end;

  if StringFound then ShowMessage( Str2 );
end;
А вообще, если цифры в первом файле упорядочены, то зачем он вообще нужен? Достаточно вывести строку из второго файла по номеру в Edit-е:
Код:
var
  File2 : Text;
  Str2 : String;
  Index, LineNumber : Integer;
  StringFound : Boolean;
begin  
  StringFound := False;
  LineNumber := StrToInt( Edit1.Text );
  AssignFile( File2, путь к файлу #2 );
  try
    Reset( File2 ); Index := 1;
    while not Eof( File2 ) do
    begin
      ReadLn( File2, Str2 );
      if ( Index = LineNumber ) then 
        begin
          StringFound := True;
          Break;
        end;
      Inc( Index );
    end;
  finally
    CloseFile( File2 );
  end;

  if StringFound then ShowMessage( Str2 );
end;

Последний раз редактировалось maxionans; 27.01.2010 в 02:31.
maxionans вне форума Ответить с цитированием
Старый 27.01.2010, 03:07   #3
mental
Пользователь
 
Регистрация: 07.01.2009
Сообщений: 36
По умолчанию

Цифры не упорядочены. Второй вариант, как я понимаю снижает скорость поиска в 2 раза. 1 файл (по которому осуществляется поиск) больше 2ГБ, второй около 500 МБ.
mental вне форума Ответить с цитированием
Старый 27.01.2010, 04:28   #4
maxionans
Форумчанин
 
Аватар для maxionans
 
Регистрация: 02.01.2010
Сообщений: 254
По умолчанию

Второй вариант не снижает скорость поиска, а выполняет его полностью, т.к. в твоем варианте поиск выполнялся только по первому файлу. Для ускорения советую хранить цифры и строки в одном файле, например, в таком формате:

1,abc
2,bcd
...
n,cde

Тогда поиск будет выполняться за один проход.
maxionans вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами в Си shturman_ivanov Помощь студентам 0 27.12.2009 21:01
работа с файлами dima0268 Общие вопросы C/C++ 1 15.12.2009 17:22
Си++. Работа с файлами. Diamond2107 Помощь студентам 12 06.12.2009 20:38
Работа с файлами ФЁкЛА Общие вопросы C/C++ 8 26.02.2009 00:16
Работа с файлами Acros Помощь студентам 5 14.02.2007 18:40