wpisywanie danych do tablicy struktur z pliku tekstowego

0

Cześć mam pewien problem, ponieważ gdy wczytuje dane jednego użytkownika z pliku tekstowego to pokazuje mi oprócz tych danych jeszcze jedna szufladka w której pokazuje tylko Id a reszta jest pusta i nie mam pojęcia jak to rozwiązać próbowałem różnych metod stosując chyba prawidłowo, ale nie przynosiło skutku. Podsyłam cały kod żeby był kontekst, ale błąd występuje w częsci 101 linia/131 linia mniej więcej
Edit: Chyba dostrzegłem problem, bo zmienna Id jest pobierana ze zmiennej x i ona się zwiększa mimo wszystko w praktyce niezbyt wiem jak to rozwiązać.


#include <iostream>
#include <windows.h>
#include <string>
#include <fstream>
#include <cstdlib>
#include <regex>

using namespace std;
string hello,obrys,odpowiedz,komenda,dom;
int wynik=0,x=1;
int nr_linii=1;
regex regimie("[A-Z]{1}[a-z]{2,19}");
regex regnazwisko("[A-Z]{1}[a-z]{1,19}");
regex regmiejscowosc("[A-Z]{1}[A-Za-z\\-?\\s?]{2,39}");
regex regkod_pocztowy("[0-9]{2}-[0-9]{3}");
regex regulica("[A-Za-z0-9\\s\\-]{3,40}");
regex regnr_domu("[1-9]{1,3}[A-Z]{1,3}");
regex regnr_mieszkania("[1-9]{1,3}");
regex regpesel("[0-9]{11}");
regex regtelefon("[0-9]{9}");
regex regstan_konta("[0-9]{0,},[0-9]{2}");
bool regi;
bool regnazw;
bool regm;
bool regkod;
bool regul;
bool regnrdomu;
bool regnrm;
bool regpes;
bool regtel;
bool regstan;
string plik_tekstowy;
struct uzytkownik
{
string Id=to_string(x);
string obryss="=========================";
bool PF=false;
string imie;
string nazwisko;
string miejscowosc;
string ulica;
string kod_pocztowy;
string nr_domu;
string pesel;
string nr_tel;
string stan_konta;
string nr_mieszkania;
};
uzytkownik uzytkownicy[1000];
fstream plik;

void help();
void add();
void create();
void save();


int main()
{
    obrys = ("====================================================================");
    for(int i = 0; i < obrys.length() ; i++){
    cout << obrys[i];
   Sleep(10);}
   cout<<endl;
    hello = ("Witaj w mojej bazie danych \njezeli chcesz otrzymac pomoc jakie wpisywac polecenia wpisz help,\njesli chcesz zaczac dzialac wpisz jakas komende");
     for(int i = 0; i < hello.length() ; i++){
    cout << hello[i];
   Sleep(10);}
   cout<<endl;
   for(int i = 0; i < obrys.length() ; i++){
    cout << obrys[i];
   Sleep(10);}
   cout<<endl;
for(;;)
  {

cout<<"<Podaj polecenie>: ";
cin>>komenda;

    if(komenda=="help")
   {
    help();
    continue;
   }
    else if (komenda=="create")
    {

cout<<"Podaj nazwe pliku tekstowego do ktorego maja byc zapisane dane bez rozszerzenia .txt: ";
cin>>plik_tekstowy;
plik.open((plik_tekstowy+".txt"),ios::in);
if(plik.good()==true)
{
 cout<<"baza zostala wybrana"<<endl;

}
else if(plik.good()==false)
{
  cout<<"Utworzono baze danych"<<endl;
}

string linia;
int nr_linii=1;
int nowa_linia=1;
while(getline(plik,linia))
{
    switch(nowa_linia)
    {
      case 1:uzytkownicy[x].Id=linia;break;
      case 2:uzytkownicy[x].imie=linia;break;
      case 3:uzytkownicy[x].nazwisko=linia;break;
      case 4:uzytkownicy[x].miejscowosc=linia;break;
      case 5:uzytkownicy[x].ulica=linia;break;
      case 6:uzytkownicy[x].kod_pocztowy=linia;break;
      case 7:uzytkownicy[x].nr_mieszkania=linia;break;
      case 8:uzytkownicy[x].nr_domu=linia;break;
      case 9:uzytkownicy[x].pesel=linia;break;
      case 10:uzytkownicy[x].nr_tel=linia;break;
      case 11:uzytkownicy[x].stan_konta=linia;break;
      case 12:uzytkownicy[x].obryss=linia;break;
    }
    nr_linii++;
    nowa_linia++;
    if(nowa_linia==12)
    {
        x++;
        nowa_linia=1;
    }
    uzytkownicy[x].PF=true;

}
plik.close();
        continue;
    }
    else  if (komenda=="add")
      {
    if(x==1000)
    {
    cout<<"baza jest pelna"<<endl;
    continue;
    }
    else
       add();
       x++;
       continue;

      }
    else if(komenda=="show")
   {
       for(x=1;x<=1000;x++)
       {
        if(uzytkownicy[x].PF==true)
    {


    cout<<"Id: "<<x<<endl;
    cout<<"imie: "              <<uzytkownicy[x].imie<<endl;
    cout<<"nazwisko: "          <<uzytkownicy[x].nazwisko<<endl;
    cout<<"miejscowosc: "       <<uzytkownicy[x].miejscowosc<<endl;
    cout<<"Ulica: "             <<uzytkownicy[x].ulica<<endl;
    cout<<"kod_pocztowy: "      <<uzytkownicy[x].kod_pocztowy<<endl;
    cout<<"numerr_mieszkania: " <<uzytkownicy[x].nr_mieszkania<<endl;
    cout<<"nr_domu: "           <<uzytkownicy[x].nr_domu<<endl;
    cout<<"pesel: "             <<uzytkownicy[x].pesel<<endl;
    cout<<"numer_telefonu: "    <<uzytkownicy[x].nr_tel<<endl;
    cout<<"stan_konta: "        <<uzytkownicy[x].stan_konta<<endl;
    cout<<uzytkownicy[x].obryss<<endl;
    }
    else
    break;
         }

   continue;
   }
   else if(komenda=="close")
   {
    plik.close();
    cout<<"Zamknieto baze danych";
   continue;
   }
   else if(komenda=="delete")
   {
    cout<<"aedd"<<endl;
   continue;
   }
   else if(komenda=="change")
   {
    cout<<"acdd"<<endl;
   continue;
   }
   else if(komenda=="search")
   {
    cout<<"asdd"<<endl;
   continue;
   }
   else if(komenda=="save")
   {
       plik.open(plik_tekstowy+".txt", ios::in | ios::app);
       save();
plik.close();
       continue;
   }
else
{
cout<<"nie ma takiej komendy"<<endl;
continue;
}


  }
    return 0;
}

void help()
  {
       cout<<"================================================"<<endl;
       cout<<"add - dodaj wiersz z informacjami o uzytkowniku "<<endl;
       cout<<"close - zamykanie bazy danych "<<endl;
       cout<<"delete - usuwanie uzytkownika z bazy danych"<<endl;
       cout<<"change - zmiana danych uzytkownika "<<endl;
       cout<<"search - wyszukaj uzytkownika/ow "<<endl;
       cout<<"show - pokaz baze danych"<<endl;
       cout<<"create - sluzy do utworzenia bazy danych\nale rowniez i do wybrania jezeli o danej nazwie baza istnieje"<<endl;
       cout<<"================================================"<<endl;

   }
void add()
{

      for(int i=1;i<=10;i++)
        {
        uzytkownicy[x].PF=true;

        if(i==1)
        {
        cout<<"Podaj imie: ";
        getline(cin,uzytkownicy[x].imie);
      regi=regex_match(uzytkownicy[x].imie,regimie);
      if(regi==false)
      {
          cout<<"blad";
          cout<<endl;
        i--;
      }
      else
        {
            i++;
        }
        }
        if(i==2)
        {
      cout<<"Podaj nazwisko: ";
     getline(cin,uzytkownicy[x].nazwisko);
      regnazw=regex_match(uzytkownicy[x].nazwisko,regnazwisko);
      if(regnazw==false)
      {
          cout<<"blad";
          cout<<endl;
         i--;
      }
      else
        {
            i++;
        }
        }
      if(i==3)
      {
      cout<<"Podaj miejscowosc: ";
      getline(cin,uzytkownicy[x].miejscowosc);
      regm=regex_match(uzytkownicy[x].miejscowosc,regmiejscowosc);
      if(regm==false)
      {
          cout<<"blad";
          cout<<endl;
i--;
      }
      else
        {
            i++;
        }
      }
      if(i==4)
      {


      cout<<"Podaj kod pocztowy: ";
      getline(cin,uzytkownicy[x].kod_pocztowy);
      regkod=regex_match(uzytkownicy[x].kod_pocztowy,regkod_pocztowy);
      if(regkod==false)
      {
          cout<<"blad";
          cout<<endl;
i--;
      }
      else
        {
            i++;
        }
      }
      if(i==5)
      {


      cout<<"Podaj ulice: ";
      getline(cin,uzytkownicy[x].ulica);
      regul=regex_match(uzytkownicy[x].ulica,regulica);
      if(regul==false)
      {
          cout<<"blad";
          cout<<endl;
i--;
      }
      else
        {
            i++;
        }
      }
      if(i==6)
      {
      cout<<"Podaj nr domu: ";
      getline(cin,uzytkownicy[x].nr_domu);
      regnrdomu=regex_match(uzytkownicy[x].nr_domu,regnr_domu);
      if(regnrdomu==false)
      {
          cout<<"blad";
          cout<<endl;
i--;
      }

      }
         if(i==7)
      {
      cout<<"Podaj nr mieszkania: ";
      getline(cin,uzytkownicy[x].nr_mieszkania);
      regnrm=regex_match(uzytkownicy[x].nr_mieszkania,regnr_mieszkania);
      if(regnrm==false)
      {
          cout<<"blad";
          cout<<endl;
i--;
      }
else
      {
          i++;
      }
      }
      if(i==8)
      {

      cout<<"Podaj pesel: ";
      getline(cin,uzytkownicy[x].pesel);
      regpes=regex_match(uzytkownicy[x].pesel,regpesel);
      if(regpes==false)
      {
          cout<<"blad";
          cout<<endl;
i--;
      }
      else
      {
          i++;
      }
      }
      if(i==9)
      {
      cout<<"Podaj nr telefonu: ";
      getline(cin,uzytkownicy[x].nr_tel);
      regtel=regex_match(uzytkownicy[x].nr_tel,regtelefon);
      if(regtel==false)
      {
          cout<<"blad";
          cout<<endl;
i--;
      }
      else
      {
          i++;
      }
      }
      if(i==10)
      {
        cout<<"Podaj stan konta: ";
      getline(cin,uzytkownicy[x].stan_konta);
      regstan=regex_match(uzytkownicy[x].stan_konta,regstan_konta);
      if(regstan==false)
      {
          cout<<"blad";
          cout<<endl;
i--;
      }
      else
        cout<<"Dodano uzytkownika"<<endl;

      }

      }
}

void save()
{

      for(x=1;x<=1000;x++)
       {
        if(uzytkownicy[x].PF==true)
    {


    plik<<uzytkownicy[x].Id<<endl;
    plik<<uzytkownicy[x].imie<<endl;
    plik<<uzytkownicy[x].nazwisko<<endl;
    plik<<uzytkownicy[x].miejscowosc<<endl;
    plik<<uzytkownicy[x].ulica<<endl;
    plik<<uzytkownicy[x].kod_pocztowy<<endl;
    plik<<uzytkownicy[x].nr_mieszkania<<endl;
    plik<<uzytkownicy[x].nr_domu<<endl;
    plik<<uzytkownicy[x].pesel<<endl;
    plik<<uzytkownicy[x].nr_tel<<endl;
    plik<<uzytkownicy[x].stan_konta<<endl;
    plik<<uzytkownicy[x].obryss<<endl;

    }
    else
    break;
         }


}


![test.PNG](https://4programmers.net/assets/36748/xgkLmK8gY1PPHfljJvRUfuEEpSuALDsnivjXQio7.png)
1

Doprawdy nie chce mi się nawet czytać tej litanii.

Zacznij używać vector<> bo uzytkownicy[1000] niedorzeczne nawet dla początkującego.
Używaj polskiego nazewnictwa.
http://forum.4programmers.net/1101404
http://forum.4programmers.net/998482

Zamiast:

string linia;
int nr_linii=1;
int nowa_linia=1;
while(getline(plik,linia))
{
    switch(nowa_linia)
    {
      case 1:uzytkownicy[x].Id=linia;break;
      case 2:uzytkownicy[x].imie=linia;break;
      case 3:uzytkownicy[x].nazwisko=linia;break;
      case 4:uzytkownicy[x].miejscowosc=linia;break;
      case 5:uzytkownicy[x].ulica=linia;break;
      case 6:uzytkownicy[x].kod_pocztowy=linia;break;
      case 7:uzytkownicy[x].nr_mieszkania=linia;break;
      case 8:uzytkownicy[x].nr_domu=linia;break;
      case 9:uzytkownicy[x].pesel=linia;break;
      case 10:uzytkownicy[x].nr_tel=linia;break;
      case 11:uzytkownicy[x].stan_konta=linia;break;
      case 12:uzytkownicy[x].obryss=linia;break;
    }
    nr_linii++;
    nowa_linia++;
    if(nowa_linia==12)
    {
        x++;
        nowa_linia=1;
    }
    uzytkownicy[x].PF=true;
}

Wystarczy:

bool readData(fstream &plik,uzytkownik &u)
{
    u.PF
    =
      getline(plik,u.Id)&&
      getline(plik,u.imie)&&
      getline(plik,u.nazwisko)&&
      getline(plik,u.miejscowosc)&&
      getline(plik,u.ulica)&&
      getline(plik,u.kod_pocztowy)&&
      getline(plik,u.nr_mieszkania)&&
      getline(plik,u.nr_domu)&&
      getline(plik,u.pesel)&&
      getline(plik,u.nr_tel)&&
      getline(plik,u.stan_konta)&&
      getline(plik,u.obryss)&&
    ;
    return u.PF;
}

...
for(int x=0;readData(plik,uzytkownicy[x]);++x) {}
...

W sumie skoro wszystko trzymasz jako napis to zastanów się nad konstrukcją:

struct { string name; } Fields[]=
{
    "id","imie","nazwisko",
     ...
    "stan_konta","obryss"
};
struct user { string data[sizeof(Fields)/sizeof(*Fields)]; } users[1000];

wtedy funkcja:

bool readData(fstream &plik,uzytkownik &u)
{
    for(int i=0;i<sizeof(Fields)/sizeof(*Fields);++i) if(!getline(plik,data[i])) return u.PF=false;
    return u.PF=true;
}

Tak samo wyświetlenie zajmie jeden wiersz.
Również zapoznaj się z: http://forum.4programmers.net/1100492
Nie pamiętam gdzie wklejałem wersję c++ więc:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

template<typename S> class Menu
{
	private:
	typedef void (S::*Executor)(int opt);
	string title,goback; // tekst menu
	vector<Menu<S>> menu; // podmenu
	Executor exec; // funkcja wykonująca polecenie menu
	int opt; // ewentualny parametr
	public:
	Menu(const string &title,const string &goback,const vector<Menu> &menu):title(title),goback(goback),menu(menu),exec(0) {}
	Menu(const string &title,Executor exec,int opt=0):title(title),exec(exec),opt(opt) {}
	void Run(S &shared)const;
};

inline istream &wsnw(istream &s) // white space no wait
{
	for(int ch=0;(ch!='\n')&&(isspace(s.peek()));) ch=s.get();
	return s;
}

inline istream &ignore(istream &s) // ignore
{
	while(s.get()!='\n') {}
	return s;
}

template<typename S> void Menu<S>::Run(S &shared)const
{
	for(int haveback=(goback.size()>0),lrange=!haveback;;)
	{
		cout<<"=================== "<<title<<':'<<endl;
		int key=0;
		for(const Menu &sub:menu) cout<<'\t'<<(++key)<<". "<<sub.title<<endl;
		if(haveback) cout<<"\t0. "<<goback<<endl;
		cout<<"Your choise: ";
		int choise;
		if(cin>>choise>>wsnw)
		{
			if((lrange<=choise)&&(choise<=menu.size()))
			{
				if(!choise--) break;
				const Menu &next=menu[choise];
				cout<<endl;
				if(next.exec) (shared.*next.exec)(next.opt);
				else next.Run(shared);
			}
			else cout<<"Error choise must be in range "<<lrange<<".."<<menu.size()<<endl;
		}
		else
		{
			cin.clear();
			cin>>ignore;
			cout<<"Error choise must be a number"<<endl;
		}
	}
}

class SharedData
{
	public:
	void SortExec(int opt) { cout<<"\t\t\tREALIZACJA: Sortowanie wg "<<(char)('A'+opt)<<endl<<endl; }
	void FindExec(int opt) { cout<<"\t\t\tREALIZACJA: Szukaj wg "<<(char)('A'+opt)<<endl<<endl; }
	void AddExec(int) { cout<<"\t\t\tREALIZACJA: Dodaj"<<endl<<endl; }
	void ShowExec(int) { cout<<"\t\t\tREALIZACJA: Przegladaj"<<endl<<endl; }
	void SaveExec(int) { cout<<"\t\t\tREALIZACJA: Zapisz"<<endl<<endl; }
	void DeleteExec(int) { cout<<"\t\t\tREALIZACJA: Usun"<<endl<<endl; }
	void LoadExec(int) 
	{
		cout<<"\t\t\tREALIZACJA: Wczytaj"<<endl;
		cout<<"Podaj napis: ";
		string text;
		cin>>text>>ignore;
		cout<<"Podano: \""<<text<<"\""<<endl<<endl;
	}
};

int main()
{
	SharedData sd;
	vector<Menu<SharedData>> menuSort
	{
		Menu<SharedData>("Sortowanie wg A",&SharedData::SortExec,0),
		Menu<SharedData>("Sortowanie wg B",&SharedData::SortExec,1),
		Menu<SharedData>("Sortowanie wg C",&SharedData::SortExec,2),
	};	
	vector<Menu<SharedData>> menuFind
	{
		Menu<SharedData>("Szukaj wg A",&SharedData::FindExec,0),
		Menu<SharedData>("Szukaj wg B",&SharedData::FindExec,1),
		Menu<SharedData>("Szukaj wg C",&SharedData::FindExec,2),
	};	
	vector<Menu<SharedData>> menuMain
	{
		Menu<SharedData>("Dodaj",&SharedData::AddExec),
		Menu<SharedData>("Przegladaj",&SharedData::ShowExec),
		Menu<SharedData>("Zapisz",&SharedData::SaveExec),
		Menu<SharedData>("Sortuj","Powrot",menuSort),
		Menu<SharedData>("Szukaj","Powrot",menuFind),
		Menu<SharedData>("Usun",&SharedData::DeleteExec),
		Menu<SharedData>("Wczytaj",&SharedData::LoadExec),
	};
	
	Menu<SharedData>("Menu glowne","Koniec",menuMain).Run(sd);
	return 0;
}
0

@pixell: Jeżeli Twoim celem nie jest nauka ręcznej serializacji i deserializacji danych do/z plików, to jednak skorzystałbym z gotowej biblioteki, lub nawet SQLite.

Poszukałbym czegoś na:
https://github.com/fffaraz/awesome-cpp

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