Cześć, mam za zadanie przerobić swój program "Książka adresowa" tak, aby zamiast do tablic struktur, zapisywał dane do wektora. Dodatkowo, dane mają być zapisywane w jednej linii, przedzielone znakiem "|". Niestety, po wpisaniu danych pierwszej osoby, w trakcie wpisywania danych drugiej osoby program kończy działanie. Po ponownym włączeniu programu, nie wyświetla się już menu tylko program wyłącza się z błędem. Problem występuje prawdopodobnie podczas wczytywania danych do struktury. Pytanie więc, jak zmienić funkcje aby odczytywała wszystkie dane z jednej linii pliku tekstowego. Poniżej mój kod.
#include <iostream>
#include <fstream>
#include <windows.h>
#include <cstdlib>
#include <vector>
using namespace std;
struct Znajomy
{
int id = 0;
string imie, nazwisko, nr_tel, adresEmail, adresZamieszkania;
};
bool szukajZnaku ( string tekst, char szukanyZnak )
{
size_t znalezionaPozycja = tekst.find ( szukanyZnak );
if( znalezionaPozycja == string::npos )
{
return false;
}
else
return true;
}
int dodanieDanych ( vector <Znajomy> znajomi, int iloscZnajomych )
{
Znajomy osoba;
string daneAdresata;
cout << "Podaj imie znajomego: ";
cin >> osoba.imie;
cout << "Podaj nazwisko znajomego: ";
cin >> osoba.nazwisko;
int i = 0;
while ( i < iloscZnajomych )
{
if (( znajomi[i].imie == osoba.imie ) && ( znajomi[i].nazwisko == osoba.nazwisko ))
{
cout << "Znajomy o takich danych juz istnieje. Wpisz inne dane: " << endl;
cout << "Podaj imie znajomego: ";
cin >> osoba.imie;
cout << "Podaj nazwisko znajomego: ";
cin >> osoba.nazwisko;
}
else
{
i++;
}
}
cout << "Podaj numer telefonu znajomego: ";
cin.sync();
getline ( cin, osoba.nr_tel );
cout << "Podaj adres e-mail znajomego: ";
cin >> osoba.adresEmail;
while( !szukajZnaku ( osoba.adresEmail, '@' ))
{
cout << "Nieprawidlowy adres e-mail. Podaj adres e-mail znajomego: ";
cin >> osoba.adresEmail;
}
cout << "Podaj adres zamieszkania znajomego: ";
cin.ignore();
getline ( cin, osoba.adresZamieszkania );
osoba.id = iloscZnajomych + 1;
znajomi.push_back(osoba);
fstream plik;
plik.open ( "ksiazkaAdresowa.txt", ios::out | ios::app );
if ( plik.good() == true )
{
osoba.id = iloscZnajomych + 1;
plik << znajomi[iloscZnajomych].id << "|";
plik << znajomi[iloscZnajomych].imie << "|";
plik << znajomi[iloscZnajomych].nazwisko << "|";
plik << znajomi[iloscZnajomych].nr_tel << "|";
plik << znajomi[iloscZnajomych].adresEmail << "|";
plik << znajomi[iloscZnajomych].adresZamieszkania << "|" << endl;
plik.close();
}
else
{
cout << "Nie udalo sie otworzyc pliku i zapisac do niego danych" << endl;
Sleep(1000);
}
cout << "Dane znajomego zostaly dodane" << endl;
Sleep(1000);
return iloscZnajomych + 1;
}
int wczytywanieZnajomychDoStruktury(vector <Znajomy> znajomi)
{
int iloscZnajomych = 0;
string linia;
int nr_linii = 1;
int numerKontaktu = 0;
fstream plik;
plik.open ( "ksiazkaAdresowa.txt", ios::in );
if(plik.good() == false)
{
plik.open ( "ksiazkaAdresowa.txt", ios::out );
plik.close();
}
else
{
while ( getline ( plik, linia ))
{
if ( nr_linii == 2 )
{
numerKontaktu++;
nr_linii = 1;
}
switch ( nr_linii )
{
case 1:
znajomi[numerKontaktu].id = atoi(linia.c_str());
break;
case 2:
znajomi[numerKontaktu].imie = linia;
break;
case 3:
znajomi[numerKontaktu].nazwisko = linia;
break;
case 4:
znajomi[numerKontaktu].nr_tel = linia;
break;
case 5:
znajomi[numerKontaktu].adresEmail = linia;
break;
case 6:
znajomi[numerKontaktu].adresZamieszkania = linia;
break;
}
nr_linii++;
}
iloscZnajomych = ++numerKontaktu;
plik.close();
}
return iloscZnajomych;
}
void wyswietlZnajomych ( vector <Znajomy> znajomi, int iloscZnajomych )
{
string imie;
fstream plik;
system ( "cls" );
int ile = 0;
for (int i = 0; i < iloscZnajomych; i++)
{
if(znajomi[i].id >= 1)
{
ile++;
cout << znajomi[i].id << "|";
cout << znajomi[i].imie << "|" << znajomi[i].nazwisko << "|";
cout << znajomi[i].nr_tel << "|";
cout << znajomi[i].adresEmail << "|";
cout << znajomi[i].adresZamieszkania << "|";
cout << endl;
}
}
if ( ile <= 0 )
{
cout << "Brak znajomych w ksiazce adresowej" << endl;
}
system ( "pause" );
}
int main()
{
vector <Znajomy> znajomi;
int idZnajomego = 0;
int iloscZnajomych = 0;
char wybor;
iloscZnajomych = wczytywanieZnajomychDoStruktury ( znajomi );
while(true)
{
if( idZnajomego == 0 )
{
system ( "cls" );
cout << "1. Dodaj dane znajomego" << endl;
cout << "2. Wyszukaj znajomych po imieniu" << endl;
cout << "3. Wyszukaj znajomych po nazwisku" << endl;
cout << "4. Wyswietl wszystkich znajomych" << endl;
cout << "5. Usun adresata" << endl;
cout << "5. Edytuj adresata" << endl;
cout << "9. Zakoncz program" << endl;
cout << endl;
cout << "Twoj wybor: ";
cin >> wybor;
if ( wybor == '1' )
{
system ( "cls" );
iloscZnajomych = dodanieDanych ( znajomi, iloscZnajomych );
}
else if ( wybor == '2' )
{
//szukaniePoImieniu ( znajomi, iloscZnajomych );
}
else if ( wybor == '3' )
{
//szukaniePoNazwisku ( znajomi, iloscZnajomych );
}
else if ( wybor == '4' )
{
system ( "cls" );
wyswietlZnajomych ( znajomi, iloscZnajomych );
}
else if ( wybor == '5' )
{
//system ( "cls" );
;
}
else if ( wybor == '6' )
{
//system ( "cls" );
;
}
else if ( wybor == '9' )
{
system ( "cls" );
cout << "Zakonczono dzialanie programu";
cout << endl;
exit(0);
}
}
}
return 0;
}