Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Редактирование txt файла (http://forum.oszone.net/showthread.php?t=221523)

Starter1 26-11-2011 20:28 1803896

Редактирование txt файла
 
Искал на просторах форума подобные темы, нашёл несколько, но так и не смог решить проблемы, поэтому задам вопрос конкретно для своего примера.
Программирую на 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 1803916

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

Starter1 26-11-2011 22:30 1803951

lxa85,
Цитата:

Делов то.
Алгоритм для меня не вопрос, такую программу я сделал на cmd. Но мне нужен хотя бы один рабочий образец чтобы делать программы на C++.

Drongo 27-11-2011 02:22 1804042

Так пойдёт?
Код:

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 1804108

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 1804204

Starter1, Я проверил на тексте, пример которого вы привели, там отработал, выводит только строки в которых нет ; или строку до ;

Starter1 27-11-2011 15:11 1804232

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

Drongo 27-11-2011 17:46 1804357

Цитата:

Цитата Starter1
Drongo, Наверное ошибка из-за того что я не использую Memo а использую List для вывода в файл »

Да принципиальной разницы нет.
Цитата:

Цитата Starter1
Можно ли сделать подобное только от ";" и до конца то есть оставлять сам комментарий? »

Код:

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()));
}



Время: 05:28.

Время: 05:28.
© OSzone.net 2001-