Błąd podczas edytowanie plków

0

Witam,

piszę program, który ma zarządzać pewnymi plikami. I w pewnym momencie natrafiłem na problem, gdyż całość działa poprawnie, jednak jeden element, w zasadzie ostatni, już nie. Program ten dysponuje nieokreśloną ilością plików. W tym jeden z nich musi mieć nazwę weapon, aby gra mogła go odnaleźć, natomiast reszta to podobne pliki, lecz zmodyfikowane, i właśnie po to mi ten program, do sprawnego zarządzania tymi plikami.

Wygląda to tak, że inne pliki mają przypisany do siebie numer, a program zamieniając te pliki, zapisuje w pliku konfiguracyjnym, dane o tym, który weapon jest właśnie aktywny (aby uniknąć błędu, i aby można było mu z powrotem nadać numerek przy zmianie), numery wszystkich (aby uniknąć podmiany nieistniejących plików), a także nazwy tych plików, które są wyświetlane podczas wyboru weapona w menu.

Cały ten plik konfiguracyjny jest w pewien sposób zakodowany. Ma zmienione rozszerzenie na .nin (od Ninjago =P) i informacje są zapisane między całą masą różnego tekstu, aby nie dało się odnaleźć, i ręcznie edytować w/w informacji. Każda z tych informacji jest zapisana między np. %numer_aktywnego%, #numer_dostępnego#, $nazwa_weapona$.

I program pobiera kolejno linie tego pliku, i szuka w nim np. %, kiedy znajdzie procent, wtedy wczytuje wszytko co jest umieszczone, aż do następnego procentu, i w ten sposób odnajduje informacje w tym gąszczu tekstu.
Niestety, podczas zmiany aktywnego weapona, trzeba też w tym pliku zmienić numerek. Dlatego program, wczytuje po kolei każdą linię. W każdej linii idzie przez każdy znak i sprawdza, czy jest on procentem, czy nie. Jeśli nie to zapisuje sobie ten znak do zmiennej i idzie dalej, jeśli natomiast trafi na %, czyli trafi na początek informacji o tym który plik ma teraz nazwę weapon, zapisze do zmiennej %, potem numer weapona, który wybraliśmy, i doda %, a potem przepisze calą resztą do zmiennej. Na koniec nadpisze cały plik konfiguracyjny tą zmienną (czyli tym samym tekstem, tylko ze zmienioną jedną liczbą).
I tu pojawia się problem, gdyż program przechodząc przez tą część, w której przepisuje całą zawartość pliku do zmiennej, ze zmienioną wartością, nagle kończy swoją pracę. Prosiłbym o przejrzenie poniższego kodu i o wyłapanie błędów.

   
    char krzaczek = '#';   //wartość jest osadzona właśnie między drabinkami 
    string select;       // -     to jest numer wybranego weapona, został wprowadzony we wcześniejszej części programu.

    fstream change_activ;

    string all_file;            //zmienna przechowujaca zawartos pliku config.nin ze zmieniona zadana wartoscia
    
    system("pause");     //program dociera tylko do tego miejsca

    change_activ.open("config.nin", ios::in);
    if(change_activ.good() == true)
    {
        for(string line;!change_activ.eof();)
        {
            
            getline(change_activ, line);            //pobieranie kolejnej linii
            
            for(int i=0;i < line.length();i++)        //zapisywanie kazdego znaku do zmiennej
            {
                if(line[i] == krzaczek)                //kiedy napotkamy krzaczka, zamieniamy istniejaca wartosc na nowa
                {
                    all_file += krzaczek;                //dodajemy krzaczka
                    all_file += select;                    //dodajemy nowa zmienna
                    all_file += krzaczek;                //dodajemy koncowego krzaczka
                    
                    for(;line[i] != krzaczek; i++);        //szukamy konca - drugiego krzaczka
                }
                else all_file += line[i];
                
            }

        }
        change_activ.close();
    } 
1
Ninjago napisał(a):

Cały ten plik konfiguracyjny jest w pewien sposób zakodowany. Ma zmienione rozszerzenie na .nin (od Ninjago =P) i informacje są zapisane między całą masą różnego tekstu, aby nie dało się odnaleźć, i ręcznie edytować w/w informacji. Każda z tych informacji jest zapisana między np. %numer_aktywnego%, #numer_dostępnego#, $nazwa_weapona$.

Nie lepiej to potraktować jakimś xorem i zapisać binarnie?

I program pobiera kolejno linie tego pliku, i szuka w nim np. %, kiedy znajdzie procent, wtedy wczytuje wszytko co jest umieszczone, aż do następnego procentu, i w ten sposób odnajduje informacje w tym gąszczu tekstu.
Niestety, podczas zmiany aktywnego weapona, trzeba też w tym pliku zmienić numerek. Dlatego program, wczytuje po kolei każdą linię. W każdej linii idzie przez każdy znak i sprawdza, czy jest on procentem, czy nie. Jeśli nie to zapisuje sobie ten znak do zmiennej i idzie dalej, jeśli natomiast trafi na %, czyli trafi na początek informacji o tym który plik ma teraz nazwę weapon, zapisze do zmiennej %, potem numer weapona, który wybraliśmy, i doda %, a potem przepisze calą resztą do zmiennej. Na koniec nadpisze cały plik konfiguracyjny tą zmienną (czyli tym samym tekstem, tylko ze zmienioną jedną liczbą).
I tu pojawia się problem, gdyż program przechodząc przez tą część, w której przepisuje całą zawartość pliku do zmiennej, ze zmienioną wartością, nagle kończy swoją pracę. Prosiłbym o przejrzenie poniższego kodu i o wyłapanie błędów.

Po co zapisujesz ten "gąszcz tekstu" do zmiennej?
Poczytaj o metodach klasy string takich jak find, find_first_of, find_last_of.

   
    char krzaczek = '#';   //wartość jest osadzona właśnie między drabinkami  

To powinno być const

 const char krzaczek = "#';
    string all_file;            //zmienna przechowujaca zawartos pliku config.nin ze zmieniona zadana wartoscia 

Jeśli już ma być po angielsku to raczej

 string whole_file; 
    if(change_activ.good() == true)

Wystarczy

 if (change_activ.good() ) 
       for(string line;!change_activ.eof();)

Nie lepiej użyć while?

 while ( getline( change_activ, line ) ) 
       
                    for(;line[i] != krzaczek; i++);        //szukamy konca - drugiego krzaczka -> TO NIC NIE ROBI

Jak już mówiłem strasznie kombinujesz.

0
    const char krzaczek='#';
    string content,line,select="jakiś napis";
    for(ifstream change_activ("config.nin");getline(change_activ,line);content+=line+'\n')
      {
       size_t pos=line.find(krzaczek);
       while(pos!=string::npos) // zamień na if jeżeli nie może być dwóch par krxzaczków
         {
          size_t end=line.find(krzaczek,pos+1);
          if(end!=string::npos) line.replace(pos+1,end-pos-1,select);
          else { } // jakaś sensowna reakcja na brak drugiego krzaczka
          pos=line.find(krzaczek,pos+select.length()+1); // wywalić tą linijkę jeżeli nie może być dwóch par krxzaczków
         }
      }

1 użytkowników online, w tym zalogowanych: 0, gości: 1