Edycja/podmiana zawartosci pliku

0

Mam nastepujaca funkcje:

 void zapisz1(char *in, char *a)
{
   String h;

          ofstream plik(in, ios::app);
          plik<<a<<endl;
          for (int i=1; i<18; i++)
             {
          h = dynamic_cast<TEdit *>(FindComponent("Edit" + (String)i))->Text;
          plik << h.c_str() << endl;
             }
             plik.close();


}	 

Dziala ona bardzo dobrze ... ale chce teraz ja tak zmodyfikowac aby sprawdzala najpierw czy plik istnieje, jezeli tak to wyszukiwala w pliku ciagu znakow (wymienionego wyzej char *a) i jezeli sie na niego natknie to zeby nadpisywala na zawartosc ponizej pobierane z editow elementy.

probowalem juz kombinowac z FileExists i z pobieraniem tekstu za pomoca getline lub prosto z pliku do zmiennej i dawac instrukcje warunkowe ze jezeli pobrana fraza == a to zeby wyswietlal sie jakis komunikat lub zeby cokolwiek sie dzialo ... ale jakos bez skutku. Prosze o pomoc. Tylko ten jeden szczegol (pewnie banalny) mi zostal do skonzcenia programu a mecze sie juz z nim tydzien i nie wiem jak to zrobic

0

Nikt nie ma żadnego pomysłu? Wydawało mi się to dość banalne.

0
  1. Otwierasz plik do odczytu
  2. Otwierasz inny tymczasowy plik do zapisu
  3. Wczytujesz wiersz i porównujesz go ze zmienną a (dobry powód aby nie nazywać tak zmienne)
  4. Jeżeli to jest tą zmienną to wpisujesz do tymczasowego pliku a i resztę natomiast z pliku wczytujesz odpowiednia ilość wierszy
  5. Jeżeli to nie jest tą zmienna to zapisujesz wczytany wiersz do pliku tymczasowego.
  6. Wracasz do wczytania kolejnego wiersza dopóki plik się nie skonczył
  7. kasujesz plik
  8. przemianowujesz tymczasowy plik na nazwę tego podstawowego.
0

Próbowałem dawać instrukcje warunkową if która sprawdzała czy to a jest rowne pobranej do buffora wartosci lecz warunek nigdy nie ejst spelniony mimo ze powinien i nic to nie daje.... :( jakby pomijal ten warunek czy cos. nie wiem w jakis sposob to zmodyfikowac aby było ok. próbuje z tym warunkiem zmienną a juz próbowałem jako char a[20] albo jako string ale dalej warunek nie jest spelniony :(

0

Pokaż kod i jakieś przykładowe wejście, bo bez tego nikt Ci tu nic nie wywróży.

0
 void zapisz0(char *in, char *a)
{
       if (FileExists(in)==true)
       {ifstream plik(in);
       ofstream file("temp.txt");
       char buff[25];
            while (!plik.eof())
            {
                  plik >> buff;
                  file << buff <<endl;
                  if (a=buff)
                  {
                    for (int i=0; i<18; i++)
                    plik >> buff;
                  }
                      
            }
            plik.close();
            file.close();
           remove (in);
           rename("temp.txt", in);
            
            }
}        

teraz problem tkwi w tym ze petla wykonuje sie tylko raz .... a powinna do konca pliku ... co z tym mozna zrobic? moze inna petle zastosowac?

0
  1. Zacznij formatować kod w przyzwoity sposób.
  2. Porównywanie napisów if(!strcmp(buf,a)) - są identyczne
  3. To co ty podałeś to wygląda na usuwanie podanej grupy a nie zamianę o którą pytałeś.
0

Nie nie zrobilem podmiane ale zeby mi sie nie mieszalo zobilem ja na zasadzie poki co dwoch funkcji:

 void zapisz0(char *in, char *a)
{
       if (FileExists(in)==true)
       {ifstream plik(in);
       ofstream file("temp.txt");
       char buff[25];
            while (plik.getline(buff, 25))
            {
                  
                  if (strcmp(a,buff)==0)
                  {
                    for (int i=0; i<17; i++)
                    {plik >> buff;}
                    continue;
                  
                  }
                   
                file << buff <<endl;      
            }
            plik.close();
            file.close();
            remove (in);
            rename("temp.txt", in);
            
            }
}       
       void zapisz1(char *in, char *a)
{
   String h;

          ofstream plik(in, ios::app);
          plik<<a<<endl;
          for (int i=1; i<18; i++)
             {
          h = dynamic_cast<TEdit *>(FindComponent("Edit" + (String)i))->Text;
          plik << h.c_str() << endl;
             }
             plik.close();


} 

Z tego wzgledu ze kolejnosc nie jest wazna takie cos akurat pasuje.
Zastosowalem sie do tego co mowiles i faktycznie dziala.
Ostatni juz chyba problem jaki mi zostal do wyeliminowania to tworzaca sie na poczatku pliku temp pusta linia w przypadku gdy a==buff.
Sprobuje jeszcze troche zmienic petle z ktorej korzystam i mam nadzieje ze juz powinno wszystko dzialac.

0

Teraz jest ok... przerobilem w ten sposob

 while (true)
            {
                  plik >> buff;
                  if (strcmp(a,buff)==0)
                  {
                    for (int i=0; i<17; i++)
                    {plik >> buff;}
                    continue;
                  
                  }
                  if (!plik){break;} 
                file << buff <<endl;      
            }

i wszystko dziala :) dziekuje za pomoc

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