| gil9red | Дата: Суббота, 28.01.2012, 21:44 | Сообщение # 1 |
частый гость
Сообщений: 31
Сейчас нет на сайте
| Здравствуйте! Позвольте я расскажу о своем конфузе: захотелось мне написать функцию, которая считывает из файла инфомацию заключенную в блоках. Делает она так: в файле есть блоки, начинаются они Begin_, заканчиваются End_, указываем в функции название блока, и функция ищет такой, если найдет, то все что есть между Begin_ и End_ записывается в строку AnsiString. Но я не могу придумать, как написать функцию, которая бы искала блоки, и заменяла информацию внутри блоков. Пытался изменить алгоритм используя функцию считывания, но не получается, помогите пожалуйста с алгоритмом поиска и замены данных))
вот код функции считывания: Code 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; }
В программировании нет совершенства, но к нему нужно стремиться. ©
|
| |
| |
| 0x90 | Дата: Суббота, 28.01.2012, 22:16 | Сообщение # 2 |
|
участник
Сообщений: 187
Сейчас нет на сайте
| Так и не понял что тебе нужно. Ты хочешь некоторый блок и внутри него вставить тескст? Покажи пример входного файла и выходного файла который должен получится.
|
| |
| |
| gil9red | Дата: Воскресенье, 29.01.2012, 01:49 | Сообщение # 3 |
частый гость
Сообщений: 31
Сейчас нет на сайте
| Да, как такие блоки начинаются я писал
Пример:
Code test.txt Begin_VolumeTrackMusic_PosLeft 479 End_VolumeTrackMusic_PosLeft
Begin_VolumeTrackMusic_PosTop 48 End_VolumeTrackMusic_PosTop Если воспользоваться моей функцией и впервом параметре вписать test.txt, а во втором параметре вписать VolumeTrackMusic_PosLeft, то функция вернут значение "479", а мне нужно что бы можно было указав имя блока заменить информацию в нем.
Добавлено (29.01.2012, 01:49) ---------------------------------------------
Я придумал алгоритм, просто я не туда глядел) алгоритм еще не доработан, примерно такой:
Code 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[i]; // если нашли if(bufer.Pos(BeginBlock)) { BuferFile->Lines->Delete(i + 1); BuferFile->Lines->Insert(i + 1, ReplacementText); BuferFile->Lines->SaveToFile(FileNamePath); BuferFile->~TMemo(); break; } } } этот алгоритм находит начало блока, и следующую строку заменяет на ту которую мы хотим, после сохраняет содержимое в файл, и уничтожаем мемо, чтобы память не тратил
этот алгоритм я делал только для своей задачи, мне нужно была замена одной строки, после начала блока
Думаю тему можно закрыть
В программировании нет совершенства, но к нему нужно стремиться. ©
Сообщение отредактировал gil9red - Воскресенье, 29.01.2012, 01:50 |
| |
| |