zapisywanie i wczytywanie z pliku, pomocy

0

oto kod:

 #include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>
#include <fstream>
 
using namespace std;
 
struct dane_zwierzecia
{
       string gatunek;
       string plec;
       string imie;
       string numer;
       string minimalna_potrzebna_przestrzen;
       string akceptowane_typy_klatek;
       };
 
dane_zwierzecia tab[100];
 
int n=1;

 
 
void wprowadz(int n){
 
                   
     
     ofstream plik;
     plik.open("plik.txt");
     
  
     
     cout << "DODAJESZ KOLEJNE ZWIERZE" << endl << endl;
     cout << "Podaj gatunek: ";
     cin >> tab[n].gatunek;
     plik << tab[n].gatunek;
     cout << "Podaj plec: ";
     cin >> tab[n].plec;
     plik << tab[n].plec;
     cout << "Podaj imie: ";
     cin >> tab[n].imie;
     plik << tab[n].imie;
     cout << "Podaj numer: ";
     cin >> tab[n].numer;
     plik << tab[n].numer;
     cout << "Podaj minimalna potrzebna przestrzen: ";
     cin >> tab[n].minimalna_potrzebna_przestrzen;
     plik << tab[n].minimalna_potrzebna_przestrzen;
     cout << "Podaj akceptowany typ klatki: ";
     cin >> tab[n].akceptowane_typy_klatek;
     plik << tab[n].akceptowane_typy_klatek;
     cout << "W twoim ZOO pojawilo sie nowe zwierze!" << endl;
     
    
     
     plik.close();
}
 
void wyswietl(int n){
                  cout << "Gatunek zwierzecia " << n << " to: " << tab[n].gatunek << endl;
                  cout << "Plec zwierzecia " << n << " to: " << tab[n].plec << endl;
                  cout << "Imie zwierzecia " << n << " to: " << tab[n].imie << endl;
                  cout << "Numer zwierzecia " << n << " to: " << tab[n].numer << endl;
                  cout << "Minimalna potrzbna przestrzen zwierzecia " <<n<< " to: " << tab[n].minimalna_potrzebna_przestrzen << endl;
                  cout << "Akceptowany typ klatki zwierzecia " <<n<< " to: " << tab[n].akceptowane_typy_klatek << endl << endl << endl;
                   
}

void szukaj(int i){
                   string szukaj;
                   cout<<"Podaj numer szukanego zwierzecia: ";
                   cin >> szukaj;
                   for(i=1;i<=n;i++) {
                   
                   if(tab[i].numer == szukaj)
                  {
                  cout << "Gatunek zwierzecia " << n << " to: " << tab[n].gatunek << endl;
                  cout << "Plec zwierzecia " << n << " to: " << tab[n].plec << endl;
                  cout << "Imie zwierzecia " << n << " to: " << tab[n].imie << endl;
                  cout << "Numer zwierzecia " << n << " to: " << tab[n].numer << endl;
                  cout << "Minimalna potrzbna przestrzen zwierzecia " <<n<< " to: " << tab[n].minimalna_potrzebna_przestrzen << endl;
                  cout << "Akceptowany typ klatki zwierzecia " <<n<< " to: " << tab[n].akceptowane_typy_klatek << endl << endl << endl;
                  }
          
         }
        }
void zpliku()
{
int n=0;
ifstream plik;
plik.open("plik.txt", ios::in);
plik >> n;
do
{
plik>>tab[n].gatunek;
plik>>tab[n].plec;
plik>>tab[n].imie;
plik>>tab[n].minimalna_potrzebna_przestrzen;
plik>>tab[n].akceptowane_typy_klatek;
n++;
}while(!plik.eof());
}
 
int main(int argc, char *argv[])
{
int znak, i, j, nr_rek;
char sign,sign1;
        do{
             system("cls");
             cout<<"aktualnie posiadasz "<<n-1<<" wpisow.\n";
             cout<<"1 - dodaj nowe zwierze\n";
             cout<<"2 - usun zwierze\n";
             cout<<"3 - wyswietl zwirzeta\n";
             cout<<"4 - szukaj zwierzecia\n";
             cout<<"5 - KONIEC PROGRAMU\n";
             cout<<"6 - wczytaj dane z pliku"<< endl << endl;
 
                        cin>>znak;
                        switch (znak)
                        {
 case 1:
                    do{
                        system("cls");
                   wprowadz(n);
                   n++;
                   cout << "czy chcesz dodac kolejne zwierze?\n1 - TAK, 0 - NIE (POWROT DO MENU)";
                   sign=getch();
                   }
                   while(sign!='0');
                   break;
 
             
 
 case 3:
  for (int i=1;i<n;i++)
   wyswietl(i);
   cout<<endl;
   getch();
   break;
   
 case 4:
   szukaj(n);
   getch();
   break;
 
  default:
  break;
 
 case 6:
{
  zpliku();
  break;
}
 
 
 
 
                                }}
                while (znak!=5);
system("PAUSE");
    return EXIT_SUCCESS;
}

Program nie wczytuje danych zapisanych w pliku.txt po ponownym skompilowaniu, nie jestem takze pewien czy dobrze je zapisuje.Chcialbym zeby plik nie byl za kazdym razem czyszczony tylko zeby dane byly dopisywane. Z gory dziekuje ze wszelka pomoc.

0

ios::app

0

eee, nadal tego nie czaje, zmiana tego co napisales w kodzie nic mi nie dala...

0

Rozumiem że ios::app zostało oczywiście dodane w trakcie otwierania pliku do zapisu?

0

sry faktycznie dziala, jednak nadal nie wiem jak zrobic, zeby dane ktora sa juz zapisane w plik.txt byly wczytywane do programu po kolejnej kompilcji, masz moze jakis pomysl? ta fukcja ktora napisalem sie zawiesza, i za bardzo nie wiem czemu...

0

I co? Mam za ciebie uruchomić to pod debugerem bo jesteś zbyt leniwy? o_O
Bez debugera, na oko, mogę powiedzieć że do pliku ładujesz to wszystko w "kupie" tzn bez żadnych separatorów, w efekcie potem przy próbie wczytywania z pliku cały taki klocek ląduje w jakimś polu.

0
 #include <cstdlib>
#include <iostream>
#include <conio.h>
#include <string>
#include <fstream>
 
using namespace std;
 
struct dane_zwierzecia
{
       string gatunek;
       string plec;
       string imie;
       string numer;
       int minimalna_potrzebna_przestrzen;
       int akceptowane_typy_klatek;
};

dane_zwierzecia tab[100];

 
int n=1;

 
 
void wprowadz(int n){
 
     
     cout << "DODAJESZ KOLEJNE ZWIERZE" << endl << endl;
     cout << "Podaj gatunek: ";
     cin >> tab[n].gatunek;
     cout << "Podaj plec: ";
     cin >> tab[n].plec;
     cout << "Podaj imie: ";
     cin >> tab[n].imie;
     cout << "Podaj numer: ";
     cin >> tab[n].numer;
     cout << "Podaj minimalna potrzebna przestrzen: ";
     cin >> tab[n].minimalna_potrzebna_przestrzen;
     cout << "Podaj akceptowany typ klatki: " << endl;
     cout << "   Mala kaltka wpisz    - 1" << endl;
     cout << "   Srednia klatka wpisz - 2" << endl;
     cout << "   Duza klatka wpisz    - 3" << endl;
     cout << "Wybrany przezemnie typ klatki to: ";  
     cin >> tab[n].akceptowane_typy_klatek;
     cout << "--------------------------------------" << endl;
     cout << "W twoim ZOO pojawilo sie nowe zwierze!" << endl;
     
     

     
}

void zapis_do_pliku(int n){
 
     ofstream plik("plik.txt", ios::out | ios::app);
    
     
     plik << n << endl;
     
     plik << tab[n].gatunek << endl;
     plik << tab[n].plec << endl;
     plik << tab[n].imie << endl;
     plik << tab[n].numer << endl;
     plik << tab[n].minimalna_potrzebna_przestrzen << endl;
     plik << tab[n].akceptowane_typy_klatek << endl;
     
     plik << endl;

    
}

void wczytywanie()
{

ifstream plik("plik.txt", ios::in);
int n;
do
{
plik >> n;
plik >> tab[n].gatunek;
plik >> tab[n].plec;
plik >> tab[n].imie;
plik >> tab[n].minimalna_potrzebna_przestrzen;
plik >> tab[n].akceptowane_typy_klatek;
n++;
}while(!plik.eof());
}
 
void wyswietl(int n)
{
     
                  cout << "Gatunek zwierzecia " << n << " to: " << "                      | " << tab[n].gatunek << endl;
                  cout << "Plec zwierzecia " << n << " to: " << "                         | " << tab[n].plec << endl;
                  cout << "Imie zwierzecia " << n << " to: " << "                         | " << tab[n].imie << endl;
                  cout << "Numer zwierzecia " << n << " to: " << "                        | " << tab[n].numer << endl;
                  cout << "Minimalna potrzbna przestrzen zwierzecia " <<n<< " to: " << "| " << tab[n].minimalna_potrzebna_przestrzen << endl;
                  cout << "Akceptowany typ klatki zwierzecia " <<n<< " to: " << "       | " << tab[n].akceptowane_typy_klatek << endl << endl << endl;
                 
}


void usun(){
int ktore;

cout << "podaj numer zwierzecia ktore chcesz usunac: ";
cin >> ktore;
cin.ignore();

for (int k=ktore; k<n; k++)
{
tab[n-1].gatunek = tab[n].gatunek;
tab[n-1].plec = tab[n].plec;
tab[n-1].imie = tab[n].imie;
tab[n-1].numer = tab[n].numer;
tab[n-1].minimalna_potrzebna_przestrzen = tab[n].minimalna_potrzebna_przestrzen;
tab[n-1].akceptowane_typy_klatek = tab[n].akceptowane_typy_klatek;
} 
n--;

cout << "Zwierze o numerze: " << ktore << " zostalo usuniete." << endl;
}

void edytuj()
{
int ktore;
     cout << "Podaj numer zwierzecia ktore chcesz zmienic: ";
     cin >> ktore;
     cin.ignore();
     
     cout << "Podaj gatunek: ";
     cin >> tab[n-1].gatunek;
     cout << "Podaj plec: ";
     cin >> tab[n-1].plec;
     cout << "Podaj imie: ";
     cin >> tab[n-1].imie;
     cout << "Podaj numer: ";
     cin >> tab[n-1].numer;
     cout << "Podaj minimalna potrzebna przestrzen: ";
     cin >> tab[n-1].minimalna_potrzebna_przestrzen;
     cout << "Podaj akceptowany typ klatki: ";
     cin >> tab[n-1].akceptowane_typy_klatek;
     
     cout << "Zwierze o numerze " << ktore <<" zostalo zmienione." << endl;
     
     
     
}
void szukaj(int i){
                   string szukaj;
                   cout<<"Podaj numer szukanego zwierzecia: ";
                   cin >> szukaj;
for(i=0;i<=n;i++) {
                   
                   if(tab[i].numer == szukaj)
                  {
                  cout << "Gatunek zwierzecia " << i << " to: " << tab[i].gatunek << endl;
                  cout << "Plec zwierzecia " << i << " to: " << tab[i].plec << endl;
                  cout << "Imie zwierzecia " << i << " to: " << tab[i].imie << endl;
                  cout << "Numer zwierzecia " << i << " to: " << tab[i].numer << endl;
                  cout << "Minimalna potrzbna przestrzen zwierzecia " <<i<< " to: " << tab[i].minimalna_potrzebna_przestrzen << endl;
                  cout << "Akceptowany typ klatki zwierzecia " <<i<< " to: " << tab[i].akceptowane_typy_klatek << endl << endl << endl;
                  }
          
                  }
}

void przydzial(int n)
{
int typ1 = 0, typ2 = 0, typ3 = 0, typ4 = 0;
for(int i=0; i<n; i++)
{
if (tab[i].akceptowane_typy_klatek == 1)
typ1 = typ1+1;
else if (tab[i].akceptowane_typy_klatek == 2)
typ2 = typ2+1;
else if (tab[i].akceptowane_typy_klatek == 3)
typ3 = typ3+1;
else
typ4 = typ4+1;
}

cout << "W malych klatkach jest: " << typ1 << " zwierzat" << endl;
cout << "W srednich klatkach jest: " << typ2 << " zwierzat" << endl;
cout << "W duzych klatkach jest: " << typ3 << " zwierzat" << endl;
cout << "Bez klatek pozostaje aktualnie: " << typ4-1 << " zwierzat" << endl;
}
int main()
{
wczytywanie();

int znak, i, j, nr_rek;

char sign,sign1;
        do{
             system("cls");
             cout<<"aktualnie posiadasz "<<n-1<<" wpisow." << endl;
             cout<<"1 - dodaj nowe zwierze" << endl;
             cout<<"2 - usun zwierze" << endl;
             cout<<"3 - edytuj zwierze" << endl;
             cout<<"4 - wyswietl zwirzeta" << endl;
             cout<<"5 - szukaj zwierzecia" << endl;
             cout<<"6 - pokaz ilosc zwierzat w klatkach" << endl;
             cout<<"7 - KONIEC PROGRAMU" << endl << endl << endl;
             
             

cin>>znak;
switch (znak)
{
case 1:
do{
 int akceptowane_typy_klatek;
 system("cls");
 wprowadz(n);
 zapis_do_pliku(n);
 
 
 

 n++;
 cout << "czy chcesz dodac kolejne zwierze?\n1 - TAK, 0 - NIE (POWROT DO MENU)";
 sign=getch();
  }
  while(sign!='0');
  break;
 
case 2:
  do{
  int n;
  system("cls");
  usun();
  cout << "CZY CHCESZ USUNAC KOLEJNY REKORD?\n1 - TAK, 0 - NIE (POWROT DO MENU)";
  sign=getch();
    }
  while(sign!='0');
  break;
 
case 3:
do
{
 edytuj();
 getch();
 cout << "Aby wrocic do MENU wcisnij 0, aby kontynuwac wcisnij 1" << endl;
 }while(sign!='0');
 break;
 
case 4:
  for (int i=1;i<n;i++)
   wyswietl(i);
   cout<<endl;
   getch();
   break;
   
case 5:
do
{
system("cls");
szukaj(n-1);
   
cout << "Aby wrocic do MENU wcisnij 0, aby kontynuwac wcisnij 1" << endl;
cin >> sign;
}while(sign!='0');
break;
 
case 6:
  
  system("cls");
  przydzial(n);
 
  cout<<endl;
  cout << "Aby wrocic do MENU wcisnij 0" << endl;
  getch();
  break;
 }
 }
 while (znak!=7);

return 0;
}

dane zapisuja sie w pliku, ale program ich nie wczytuje. Mysle ze problem tkwi w funkcji wczytujacej, jednak nie mam pojecia jaki. Z gory dzieki za wszelka pomoc.

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