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;
}
Поиск и замена текста в файле
Здравствуйте! Позвольте я расскажу о своем конфузе: захотелось мне написать функцию, которая считывает из файла инфомацию заключенную в блоках. Делает она так: в файле есть блоки, начинаются они Begin_, заканчиваются End_, указываем в функции название блока, и функция ищет такой, если найдет, то все что есть между Begin_ и End_ записывается в строку AnsiString. Но я не могу придумать, как написать функцию, которая бы искала блоки, и заменяла информацию внутри блоков. Пытался изменить алгоритм используя функцию считывания, но не получается, помогите пожалуйста с алгоритмом поиска и замены данных))
Код:
char bufer[256];
ifstream READ_FILE;
READ_FILE >> bufer;
ifstream READ_FILE;
READ_FILE >> bufer;
Алгоритм поиска и замены:
1: найти нужный блок. запомнить адрес начала блока
2: установить указатель позиции в файле на адрес начала блока. перезаписать файл
Кстати, блоки одинаковой длины?
ifstream READ_FILE;
READ_FILE >> bufer;
создаем символьную переменную
создаем экземпляр ifstream, это для считывания из файлов/потоков,
первое что встретили в файле, записываем переменную bufer
но при таком считывании пробелы, знаки перехода на следующую строку,
и знаки конца файла игнорируются
Цитата:
Кстати, блоки одинаковой длины?
Да, там нужно просто заменить одно символьное слово, большего не нужно:)
А алгоритм поиска довольно прост: находим в файле начало блока например Begin_Test, все что попадается после этого блока записывается в переменную String, исключения только для комментариев, и конца блока End_Test
Цитата: gil9red
char bufer[256];
ifstream READ_FILE;
READ_FILE >> bufer;
создаем символьную переменную
создаем экземпляр ifstream, это для считывания из файлов/потоков,
первое что встретили в файле, записываем переменную bufer
но при таком считывании пробелы, знаки перехода на следующую строку,
и знаки конца файла игнорируются
ifstream READ_FILE;
READ_FILE >> bufer;
создаем символьную переменную
создаем экземпляр ifstream, это для считывания из файлов/потоков,
первое что встретили в файле, записываем переменную bufer
но при таком считывании пробелы, знаки перехода на следующую строку,
и знаки конца файла игнорируются
Сейчас посмотрел, почему такой код у меня падает. Да, работать будет.
алгоритм еще не доработан, примерно такой:
Код:
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;
}
}
}
{
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;
}
}
}
этот алгоритм находит начало блока, и следующую строку заменяет на ту которую мы хотим,
после сохраняет содержимое в файл, и уничтожаем мемо, чтобы память не тратил
этот алгоритм я делал только для своей задачи, мне нужно была замена одной строки, после начала блока
Думаю теперь тему можно закрыть:)