Edycja rekordu C++

0

Mam problem z edycją rekordu.

void edytuj(const char *in,uczen *u,int n,int nr)  // znow wskaznik in na nazwe pliku i wskaznik s na strukture
{

   fstream plik;
    plik.open(in);
    char znak;
    znak=getchar();
    uczen tmpDane;
    int i=nr-1; //bo jedziemy od zera w rekordzie a wyswietlana numeracja od 1
    do
    {
        cout<<"Podaj Imie :\n";
        cin>>tmpDane.imie;

        cout<<"Podaj Nazwisko :\n";
        cin>>tmpDane.nazwisko;

        cout<<"Klasa :\n";
        cin>>tmpDane.klasa;

        cout<<"Podaj ocene z zachowania :\n";
        cin>>tmpDane.zach;

        cout<<"Podaj srednia ocen :\n";
        cin>>tmpDane.srednia;

        cout<<"Czy dane poprawne? [t/n]\n";
        cin >> znak;

        if (znak == 't')
        {
            u[i].nr = i+1;
            u[i].imie = tmpDane.imie;
            u[i].nazwisko = tmpDane.nazwisko;
            u[i].klasa= tmpDane.klasa;
            u[i].zach = tmpDane.zach;
            u[i].srednia = tmpDane.srednia;


            plik<<u[i].nr<<endl;
            plik<<u[i].imie<<endl;
            plik<<u[i].nazwisko<<endl;
            plik<<u[i].klasa<<endl;
            plik<<u[i].zach<<endl;
            plik<<u[i].srednia<<endl;
            plik<<"\n\n";
            i=i+1;
        }
    }
    while(i<n);
    plik.close();
} 

Załóżmy,że mam 3 wpisy. Chce edytować ten ostatni. Ładnie podmieniło dane ale rekord zapisano na początku jak temu zaradzić?

0

Bo nie zapisujesz do pliku niezmienionych rekordów, a tylko te które uległy zmianie.

0

Nie da się wstawić w środek pliku nawet jednego bajtu.
Do podmiany najprościej:

  • stworzyć dodatkowy plik, rekordy które mają pozostać bez zmian przepisać do nowego pliku, zamiast zmienianego wpisać od razu nowy.
  • na końcu podmienić plik.
0

Działa! Dziękuje za pomoc! Oto kod:

 void edytuj(const char*in,uczen*u,int n, int nr)
{
   uczen tab[1000];
   int i=0;
   int j=0;
   fstream plik;
   plik.open(in);
   for(i=0; i<=n; i++)
   {
       plik>>tab[i+1].nr;
       plik>>tab[i].imie;
       plik>>tab[i].nazwisko;
       plik>>tab[i].klasa;
       plik>>tab[i].zach;
       plik>>tab[i].srednia;
   }
   plik.close();

                cout<<"Podaj imie :\n";
                cin>>tab[nr-1].imie;
                cout<<"Podaj nazwisko :\n";
                cin>>tab[nr-1].nazwisko;
                cout<<"Podaj klase :\n";
                cin>>tab[nr-1].klasa;
                cout<<"Podaj ocene z zachowania :\n";
                cin>>tab[nr-1].zach;
                cout<<"Podaj srednia ocen:\n";
                cin>>tab[nr-1].srednia; //i tak do kazdego 

   ofstream plik2;
   plik2.open(in,ios::trunc);
   for(j=0; j<=n; j++)
   {
       
           plik2<<tab[j+1].nr;
           plik2<<tab[j].imie<<endl;
           plik2<<tab[j].nazwisko<<endl;
           plik2<<tab[j].klasa<<endl;
           plik2<<tab[j].zach<<endl;
           plik2<<tab[j].srednia<<endl<<endl;
       }
   plik2.close();

} 

Mam nadzieje ze komus sie przyda ;)

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