Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск и замена текста в файле

77K
28 января 2012 года
gil9red
5 / / 22.01.2012
Здравствуйте! Позвольте я расскажу о своем конфузе: захотелось мне написать функцию, которая считывает из файла инфомацию заключенную в блоках. Делает она так: в файле есть блоки, начинаются они Begin_, заканчиваются End_, указываем в функции название блока, и функция ищет такой, если найдет, то все что есть между Begin_ и End_ записывается в строку AnsiString. Но я не могу придумать, как написать функцию, которая бы искала блоки, и заменяла информацию внутри блоков. Пытался изменить алгоритм используя функцию считывания, но не получается, помогите пожалуйста с алгоритмом поиска и замены данных))

вот код функции считывания:
Код:
String ReadFile(String FileNamePath, String NameBlock)
  {
   String BlockBeginRead = "Begin_";
            BlockBeginRead+= NameBlock;
   String BlockEndRead  = "End_";
             BlockEndRead += NameBlock;
   String BlockBeginComment = "!!";
   String BlockEndComment   = ";";

   BOOL ReadAccess = true;
   BOOL BeginBlock = false;

   char bufer[256];
   String text;
   String BufferBlock = "";

   ifstream READ_FILE;

   READ_FILE.open(FileNamePath.c_str());

   while(!READ_FILE.eof())
   {
    READ_FILE >> bufer;
    text = bufer;
    if(text == BlockBeginComment)
    {
     ReadAccess = FALSE;
     continue;
    }
    if(text == BlockEndComment)
    {
     ReadAccess = TRUE;
     continue;
    }
    if(text == BlockBeginRead)
    {
     BeginBlock = true;
     continue;
    }
    if(text == BlockEndRead)
    {
     break;
    }
    if(BeginBlock && ReadAccess)
    {
     BufferBlock += text;
     BufferBlock += " ";
    }
   }
   READ_FILE.close();

   BufferBlock.SetLength(BufferBlock.Length() - 1);
 return BufferBlock;
}
316
29 января 2012 года
Alm3n
889 / / 29.05.2009
Что-то не вкурил, как работает функция. Особенно
 
Код:
char bufer[256];
ifstream READ_FILE;
READ_FILE >> bufer;

Алгоритм поиска и замены:
1: найти нужный блок. запомнить адрес начала блока
2: установить указатель позиции в файле на адрес начала блока. перезаписать файл
Кстати, блоки одинаковой длины?
77K
29 января 2012 года
gil9red
5 / / 22.01.2012
char bufer[256];
ifstream READ_FILE;
READ_FILE >> bufer;

создаем символьную переменную
создаем экземпляр ifstream, это для считывания из файлов/потоков,
первое что встретили в файле, записываем переменную bufer

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

Цитата:
Кстати, блоки одинаковой длины?


Да, там нужно просто заменить одно символьное слово, большего не нужно:)

77K
29 января 2012 года
gil9red
5 / / 22.01.2012
А алгоритм поиска довольно прост: находим в файле начало блока например Begin_Test, все что попадается после этого блока записывается в переменную String, исключения только для комментариев, и конца блока End_Test
316
29 января 2012 года
Alm3n
889 / / 29.05.2009
Цитата: gil9red
char bufer[256];
ifstream READ_FILE;
READ_FILE >> bufer;

создаем символьную переменную
создаем экземпляр ifstream, это для считывания из файлов/потоков,
первое что встретили в файле, записываем переменную bufer

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


Сейчас посмотрел, почему такой код у меня падает. Да, работать будет.

77K
29 января 2012 года
gil9red
5 / / 22.01.2012
Я придумал алгоритм, просто я не туда глядел)
алгоритм еще не доработан, примерно такой:

Код:
void WriteFile(String FileNamePath, String NameBlock, String ReplacementText)
{
 String BeginBlock = "Begin_";
           BeginBlock+= NameBlock;
 HANDLE t = Form1->Handle;
 
 TMemo *BuferFile = new TMemo(t);

 // загружаем в мемо содержимое файла
 BuferFile->Lines->LoadFromFile(FileNamePath);

// проверяем каждую строку
 for(int i = 0; i < BuferFile->Lines->Count; i++)
 {
  // получаем строку
  String bufer = BuferFile->Lines->Strings;
  // если нашли
  if(bufer.Pos(BeginBlock))
  {
   BuferFile->Lines->Delete(i + 1);
   BuferFile->Lines->Insert(i + 1, ReplacementText);
   BuferFile->Lines->SaveToFile(FileNamePath);
   BuferFile->~TMemo();
   break;
  }
 }
}


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

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

Думаю теперь тему можно закрыть:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог