Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.04.2018, 19:40
Taras2020 Taras2020 вне форума
Прохожий
 
Регистрация: 15.01.2018
Сообщения: 25
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Результат в один файл / Delphi XE

Сейчас программа сохраняет результат в разные файлы, не могу разобраться как сохранить все результаты в один файл.

Ребята, Может кто подскажет ?
Код:
procedure ProcessedFile(var F: TextFile; const Matching: array of string);
type
  // Информация об искомых строках
  StrInfo = record
    // В какой файл пишем результат
    F: TextFile;
    // Текущая позиция поиска
    Idx: Integer;
  end;
var
  LenArray: Integer;
  Str: string;
  InfoData: array of StrInfo;
  i: Integer;
  // Какой символ из считанной строки сравнивается
  CharIdx: Integer;
  // Сколько подстрок совпало
  MatchCnt: Integer;
  LenStr: Integer;
begin
  LenArray := Length(Matching);
  SetLength(InfoData, LenArray);
  // Используем это поле, чтобы узнать какие файлы удалось открыть
  // 0 - файл закрыт
  for i := 0 to LenArray - 1 do
    InfoData[i].Idx := 0;
  try
    // Открываем все файлы на запись
    for i := 0 to LenArray - 1 do begin
      AssignFile(InfoData[i].F, IntToStr(i + 1) + '.txt');
      Rewrite(InfoData[i].F);
      // Файл открылся, 0 убрали
      InfoData[i].Idx := 1;
    end;
 
    while not Eof(F) do begin
      // Читаем следующую строку из файла
      Readln(F, Str);
      // Сравнение для всех подстрок начинаем с 1 символа
      for i := 0 to LenArray - 1 do
        InfoData[i].Idx := 1;
      // Пока не нашли ни одной подстроки
      MatchCnt := 0;
      // Сравниваем каждый считанный символ с текущей позицией в искомой подстроке
      for CharIdx := 1 to Length(Str) do begin
        for i := 0 to LenArray - 1 do begin
          LenStr := Length(Matching[i]);
          // Если еще не нашли всю подстроку
          if InfoData[i].Idx <= LenStr then begin
            // Если текущий считанный символ совпадает с текущим символом в искомой подстроке
            if Str[CharIdx] = Matching[i, InfoData[i].Idx] then begin
              // Если дошли до конца подстроки, то совпали все символы
              if InfoData[i].Idx = LenStr then begin
                // Увеличиваем число совпадений
                Inc(MatchCnt);
                // Записываем считанную строку в нуужный файл
                Writeln(InfoData[i].F, Str);
              end else
                // Увеличиваем позицию
                Inc(InfoData[i].Idx);
            end else begin
              // Если текущий считанный символ НЕ совпадает с текущим символом в искомой подстроке
              // то начинаем поиск по этой подстроке сначала
              InfoData[i].Idx := 1;
            end;
          end;
        end;
        // Если нашли ВСЕ подстроки, то дальше проверять символы не нужно
        if MatchCnt = LenArray then
          Break;  // прерываем текущую итерацию
      end;
    end;
  finally
    // Закрываем все открытые файлы
    for i := 0 to LenArray - 1 do begin
      // Если файл был открыт, то закрываем
      if InfoData[i].Idx <> 0 then
        CloseFile(InfoData[i].F);
    end;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  F: TextFile;
begin
  if OpenDialog1.Execute then begin
    AssignFile(F, OpenDialog1.FileName);
    Reset(F);
    try
      ProcessedFile(F, [Edit1.Text, Edit2.Text, Edit3.Text]);
    finally
      CloseFile(F);
    end;
  end;
end;
Ответить с цитированием
  #2  
Старый 12.04.2018, 10:57
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 2,947
Версия Delphi: D7E
Репутация: 1834
По умолчанию

По идеи, Reset(f) нужно заменить на Append(f), но правда, не вижу, где
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Taras2020 (12.04.2018)
  #3  
Старый 12.04.2018, 12:07
Taras2020 Taras2020 вне форума
Прохожий
 
Регистрация: 15.01.2018
Сообщения: 25
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
По идеи, Reset(f) нужно заменить на Append(f), но правда, не вижу, где
Я уже всю голову сломал. И тоже не знаю как это сделать. Но спасибо за наводку. Ребята, Может у кого еще есть идеи ?
Ответить с цитированием
  #4  
Старый 13.04.2018, 08:23
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 2,947
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Не, я тоже голову немного поднапряг, смотрю в "книгу" - а вижу фигу, ситуёвину воспроизвести, с подложкой на свою сборку, не, не репликатируется, пжлст, ложьте свою сабжевую версию, а как иначе, без этого, не ведомо
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Taras2020 (13.04.2018)
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2017

ВКонтакте   Facebook   Twitter