C++ Edycja/modyfikowanie rekordu zapisanego w pliku txt

0

Witam serdecznie.
Czy mógłby mi ktoś pomoc jak zrobić edycje / modyfikacje rekordu, ktory juz istnieje w bazie danych (jest w pliku txt).
Mam dwa sposoby. Zaden nie dziala.


void edytuj(char*in,Zoo*z,int n)
{
   Zoo tab[1000];
   int i=0;
   int j=0;
   int numer;
   fstream plik;
   plik.open(in);
   for(i=0; i<=n; i++)
   {
       plik>>tab[i+1].numer;
       plik>>tab[i].imie;
       plik>>tab[i].gatunek;
       plik>>tab[i].plec;
       plik>>tab[i].wiek;
       plik>>tab[i].przestrzen;
       plik>>tab[i].typ;
       plik>>tab[i].nr;
   }
   plik.close();

                cout<<"Podaj imie :\n";
                cin>>tab[numer-1].imie;
                cout<<"Podaj gatunek :\n";
                cin>>tab[numer-1].gatunek;
                cout<<"Podaj plec :\n";
                cin>>tab[numer-1].plec;
                cout<<"Podaj wiek :\n";
                cin>>tab[numer-1].wiek;
                cout<<"Podaj przestrzen:\n";
                cin>>tab[numer-1].przestrzen; 
                cout<<"Podaj typ :\n";
                cin>>tab[numer-1].typ;
                cout<<"Podaj numer lokalu:\n";
                cin>>tab[numer-1].nr; 
   ofstream plik2;
   plik2.open(in,ios::trunc);
   for(j=0; j<=n; j++)
   {

           plik2<<tab[j+1].numer;
           plik2<<tab[j].imie<<endl;
           plik2<<tab[j].gatunek<<endl;
           plik2<<tab[j].plec<<endl;
           plik2<<tab[j].wiek<<endl;
           plik2<<tab[j].przestrzen<<endl;
           plik2<<tab[j].typ<<endl;
           plik2<<tab[j].nr<<endl;
       }
   plik2.close();

} 

oraz

wywolanie


                case 6:
                {
                int n=rozmiar(argv[1]);
           Zoo *z = new Zoo[n];
           edytuj(argv[1],z,n);

i ten drugi sposob


           int n=rozmiar(argv[1]);
           Zoo *z = new Zoo[n];
           zpliku(argv[1],z,n);
           ofstream plik;
           int wybor;
           cout<<"Podaj numer zwierzatka, ktore chcesz edytowac"<<endl;
           cin>>wybor;
           string nowe_imie;
           int nowy_wiek;
           double nowa_przestrzen;
           string nowy_typ;
           int nowy_nr;
for (int i=0;i<n-1;i++)
           {
               if ((wybor!=z[i].numer))
               {
                                       if(wybor==1)
                                       {
                                                   cout<<"Podaj nowe imie"<<endl;
                                                   cin>>nowe_imie;

                                strcpy(&plik[pozycja].imie, &nowe_imie);                   
                               // plik.imie==nowe_imie;
                               plik<<z[i].gatunek<<endl;
                                plik<<z[i].plec<<endl;
                                plik<<z[i].wiek<<endl;
                                plik<<z[i].przestrzen<<endl;
                                plik<<z[i].typ<<endl;
                                plik<<z[i].nr<<endl;
                                plik<<"\n\n";
                                }
                }
           }

siedze juz nad tym dosc dlugo i nic. bardzo prosze o pomoc
(najlepiej pokazanie na przykladzie)

0

Plik zakładam, że jest tekstowy. Sprzorządź go tak abyś wiedział, gdzie zaczyna się i gdzie kończy odpowiednia struktura. Kiedy już odczytasz interesującą Cię strukturę nanieś poprawki i wklej w dokładnie to samo miejsce w pliku. Pozycje odczytu pobierasz, a potem w dokładnie tą samą pozycję wstawiasz już poprawioną strukturę

Dlatego lepszym sposobem, do zapisywania struktur w pliku byłoby zapisywanie danych binarnie, z tego względu, że struktura jest tak samo duża jak kolejna, następnie poprzez fseek() poszukujemy *i sizeof(struktura)** i dokładnie w tym samym miejscu zapisujemy

0

Na wstępie - dziękuję za odpowiedź.

Plik zakładam, że jest tekstowy. Sprzorządź go tak abyś wiedział, gdzie zaczyna się i gdzie kończy odpowiednia struktura. Kiedy już odczytasz interesującą Cię strukturę nanieś poprawki i wklej w dokładnie to samo miejsce w pliku. Pozycje odczytu pobierasz, a potem w dokładnie tą samą pozycję wstawiasz już poprawioną strukturę

Tak. Plik tekstowy - i taki niestety musi byc.
Doskonale zdaje sobie sprawe ze wlasnie tak trzeba to zrobic, tylko jakos "na kod nie umiem tego przelac"....
pozdrawiam

0

niech wszystkie dane będą umieszczone do każdej struktury w oddzielnej linii. Odnosząc się do odpowiedniej struktury to będzie po prostu odniesienie się do odpowiedniej linii.

for(int i = 0; i < choice - 1; ++i) // choice - 1, bo chcemy najpierw dostać pozycję
    getline(in, line);

position = in.tellg;
in >> nazwisko;
in >> imie;
in >> costam;
//itp...
//dokonujemy zmian, a potem:
ofstream out (nazwa, ios::app);
in.seekp(position, ios_base::beg);
out << nazwisko;
out << imie;
out << costam;
//itd..
0

a czy powinnam jeszcze coś do biblioteki dodać, oprócz tego co mam:
#include <iostream>
#include <string>
#include <fstream>
ponieważ program się buntuje przy:

  • getline(in, line);
  • position = in.tellg;
  • ofstream out (nazwa, ios::app);
  • in.seekp(position, ios_base::beg);
    p.s. korzystam z dev c++
0

Zmień kompilator. To raz.
Dwa, stwórz takie obiekty jak
string line;
ifstream in("plik.txt");
potem możesz użyć getline(in, line);
następnie stwórz obiekt int position;
potem ofstream out("plik.txt", ios::app);
in.seekp(position, ios_base::beg);

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