Войти

Показать полную графическую версию : [решено] Редактирование txt файла


Starter1
26-11-2011, 20:28
Искал на просторах форума подобные темы, нашёл несколько, но так и не смог решить проблемы, поэтому задам вопрос конкретно для своего примера.
Программирую на Builder C++ 6, точнее учусь сейчас.

Задача такова: есть файл test.txt, в нём всякий текст, комментарии, и слова в скобках [].
Фрагмента из txt:

[outfit_base]
; delete full_scale_icon next update- obsolete, use full_icon_name instead !!!
; [old_base] устаревшее значение
;{ парамметры необходимые
для нормальной работы
в базовом режиме [base] }

additional_inventory_weight = 0 ; +max_walk_weight
additional_inventory_weight2 = 0 ; +40 kg
full_icon_name = npc_icon_without_outfit

При обработке комментарии не учитывать
Как видите комментарий идёт после ";" и внутри фигурных скобок ;{ тута } (причём первая фигурная скобка со знаком ";").
Нужно вывести в отдельный exit.txt файл всё что находится в квадратных скобка [], повторюсь: при обработке комментарии не учитывать, то есть [old_base], [base] и прочее не выводить.

Заранее спасибо :) !

lxa85
26-11-2011, 20:56
Starter1, И в чем проблема?
Рассмотрите варианты расстановки комментариев, определите логические условия определяющие начало и конец комментария. Точно также сделайте для слов в квадратных скобках.
Анализируйте текст с заданными условиями. Делов то.

Starter1
26-11-2011, 22:30
lxa85, Делов то. Алгоритм для меня не вопрос, такую программу я сделал на cmd. Но мне нужен хотя бы один рабочий образец чтобы делать программы на C++.

Drongo
27-11-2011, 02:22
Так пойдёт?void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i = 0; i < Memo1->Lines->Count; i++){
if(Memo1->Lines->Strings[i].Pos(";") )
if(Memo1->Lines->Strings[i].Pos(";") == 1)
continue; //Memo2->Lines->Add(Memo1->Lines->Strings[i]);
else
Memo2->Lines->Add(Memo1->Lines->Strings[i].SubString(1, Memo1->Lines->Strings[i].Pos(";")-1));
}
}

Starter1
27-11-2011, 11:12
Drongo, Попробовал, странный вывод. Выводит не все строки, даже те в которых нет ";".
Немного переделал:

TStringList *lst = new TStringList;
TStringList *lstReplace = new TStringList;
String str = ";";
String tempStr;
lst->LoadFromFile(ExtractFilePath(Application->ExeName) + "test.ltx");

for(int j = 0; j < lst->Count; j++){
if(lst->Strings[j].Pos(str)){
lstReplace->Add(lst->Strings[j].SubString(1, lst->Strings[j].Pos(str)-1));
}
else lstReplace->Add(lst->Strings[j]);
}
lstReplace->SaveToFile(ExtractFilePath(Application->ExeName) + "Test.txt");
delete lst;
delete lstReplace;
Close();

Замечательно, комментарии удаляет но остаются пустые строки. Теперь буду продолжать дальше :) ! Спасибо.

Drongo
27-11-2011, 14:41
Starter1, Я проверил на тексте, пример которого вы привели, там отработал, выводит только строки в которых нет ; или строку до ;

Starter1
27-11-2011, 15:11
Drongo, Наверное ошибка из-за того что я не использую Memo а использую List для вывода в файл. Ещё такой вопрос. Я так понял (1, lst->Strings[j].Pos(str)-1)) это обработка строки, 1 и -1 это отступы от краев, 1 сначала а -1 с того места где стоит ";", то есть с Pos(str). Можно ли сделать подобное только от ";" и до конца то есть оставлять сам комментарий?

Drongo
27-11-2011, 17:46
Drongo, Наверное ошибка из-за того что я не использую Memo а использую List для вывода в файл »Да принципиальной разницы нет.
Можно ли сделать подобное только от ";" и до конца то есть оставлять сам комментарий? »
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i = 0; i < Memo1->Lines->Count; i++)
if(Memo1->Lines->Strings[i].Pos(";") )
Memo2->Lines->Add(Memo1->Lines->Strings[i].SubString(Memo1->Lines->Strings[i].Pos(";")+1, Memo1->Lines->Strings[i].Length()));
}




© OSzone.net 2001-2012