Książka adresowa, wektory i struktury

0

Witam,
tworzę (a właściwie modyfikuję) stworzoną wcześniej przeze mnie książkę adresową. Zamiast struktur tablic ma być wektor struktur. Poniżej wklejam kod:

#include <iostream>
#include <windows.h>
#include <fstream>
#include <cstdlib>
#include <vector>

using namespace std;

struct Adresat
{
    int id = 0;
    string imie = "", nazwisko = "", nr_tel = "", email = "", adres = "";
};

int policzAdresatow (FILE * plik)
{
    int ilosc = 0;
    fstream plikTekstowy;
    plikTekstowy.open("KsiazkaAdresowa.txt", ios::in);

    if (plikTekstowy.good() == true)
    {
    string line;

    ifstream file("KsiazkaAdresowa.txt");
    while(getline(file, line))
    {
        ilosc++;
    }
    plikTekstowy.close();
    }
    return ilosc;
}

int wprowadzanieDanych(vector <Adresat> adresaci, int iloscAdresatow)
{

    Adresat ulatwienie;
    ulatwienie.id = iloscAdresatow + 1;

    string imie, nazwisko, nr_tel, email, adres;
    cout << "Podaj imie: ";
    cin >> ulatwienie.imie;
    cout << "Podaj nazwisko: ";
    cin >> ulatwienie.nazwisko;
    cout << "Podaj numer telefonu: ";
    cin.sync();
    getline(cin, ulatwienie.nr_tel);
    cout << "Podaj email: ";
    cin >> ulatwienie.email;
    cout << "Podaj adres: ";
    cin.sync();
    getline(cin, ulatwienie.adres);

    adresaci.push_back(ulatwienie);


    cout << "ilosc " << iloscAdresatow;

    fstream plik;
    plik.open("KsiazkaAdresowa.txt", ios::out | ios::app);
    if (plik.good())
    {
        plik << adresaci[iloscAdresatow].id << "|";
        plik << adresaci[iloscAdresatow].imie << "|";
        plik << adresaci[iloscAdresatow].nazwisko << "|";
        plik << adresaci[iloscAdresatow].nr_tel << "|";
        plik << adresaci[iloscAdresatow].email << "|";
        plik << adresaci[iloscAdresatow].adres << "|";
        plik << endl;
        plik.close();

        cout << "Przyjaciel dopisany do ksiazki adresowej" << endl;
        Sleep(1000);
    }
    else
    {
        cout << "Nie mozna otworzyc pliku: KsiazkaAdresowa.txt" << endl;
    }
    iloscAdresatow++;
    return iloscAdresatow;
}

Adresat pobierzDaneAdresata(string daneAdresata)
{
    Adresat pobrane;
    int id = 0;
    string imie, nazwisko, nr_tel, email, adres;
    string bufor [6] = daneAdresata;

    for(int i= 0 ; i < 6; i++)
    {
        getline(cin,bufor[i], '|');
        pobrane.id = atoi(bufor[0].c_str());
        pobrane.imie = bufor[1];
        pobrane.nazwisko = bufor[2];
        pobrane.nr_tel = bufor[3];
        pobrane.email = bufor[4];
        pobrane.adres = bufor[5];
    }
    return pobrane;
}

void wczytajAdresatowZPliku(vector<Adresat> &adresaci)
{
    Adresat jedenAdresat;
    string daneAdresata = "";

    fstream plikTekstowy;
    plikTekstowy.open("KsiazkaAdresowa.txt", ios::in);

    if (plikTekstowy.good() == true)
    {
        while (getline(plikTekstowy, daneAdresata))
        {
            jedenAdresat = pobierzDaneAdresata(daneAdresata);

            adresaci.push_back(jedenAdresat);

            cout << adresaci.size();
        }
        plikTekstowy.close();
    }
}

/*void wyswietlAdresatow (vector <Adresat> &adresaci, int iloscAdresatow)
{
    cout << "ilosc " << iloscAdresatow;

    for (int i = 0; i < iloscAdresatow; i++)
    {
        cout << endl;
        cout << "ID: " << adresaci[i].id << endl;
        cout << adresaci[i].imie << " " << adresaci[i].nazwisko << endl;
        cout << "Telefon: " << adresaci[i].nr_tel << endl;
        cout << "Email: " << adresaci[i].email << endl;
        cout << "Adres: " << adresaci[i].adres << endl;
        cout << endl;
    }
}

int szukajPoImieniu(vector <Adresat> &adresaci,int iloscAdresatow)
{
    string imie;
    cin >> imie;
    for( int i = 0; i < iloscAdresatow; i++)
    {
        if (adresaci[i].imie == imie)
        {
            cout << adresaci[i].id << ".";
            cout << adresaci[i].imie;
            cout << adresaci[i].nazwisko;
            cout << adresaci[i].nr_tel;
            cout << adresaci[i].email;
            cout << adresaci[i].adres;
            cout << endl;
        }
    }
    system("pause");
    return 0;
}

int szukajPoNazwisku(vector <Adresat> &adresaci,int iloscAdresatow)
{
    string nazwisko;
    cin >> nazwisko;
    for( int i = 0; i < iloscAdresatow; i++)
    {
        if (adresaci[i].nazwisko == nazwisko)
        {
            cout << adresaci[i].id << ".";
            cout << adresaci[i].nazwisko;
            cout << adresaci[i].imie;
            cout << adresaci[i].nr_tel;
            cout << adresaci[i].email;
            cout << adresaci[i].adres;
            cout << endl;
        }
    }
    system("pause");
    return 0;
}*/

int main()
{
    vector <Adresat> adresaci;
    int iloscAdresatow = 0;
    char wybor;
    FILE * plik;
    plik = fopen( "KsiazkaAdresowa.txt", "r" );

    while(1)
    {
        system("cls");
        iloscAdresatow = policzAdresatow(plik);
        cout << "1. Dodaj adresata" << endl;
        cout << "2. Wyszukaj po imieniu" << endl;
        cout << "3. Wyszukaj po nazwisku" << endl;
        cout << "4. Wyswietl wszystkich adresatow" << endl;
        cout << "5. Usun adresata" << endl;
        cout << "6. Edytuj adresata" << endl;
        cout << "9. Zakoncz program" << endl;
        cout << "Twoj wybor: ";
        cin >> wybor;
        cout << endl;
        if (wybor == '1')
        {
            iloscAdresatow = wprowadzanieDanych(adresaci, iloscAdresatow);
            Sleep(1000);

        }
        else if (wybor == '2')
        {
            //szukajPoImieniu(adresaci,iloscAdresatow);
        }
        else if (wybor == '3')
        {
            //szukajPoNazwisku(adresaci,iloscAdresatow);
        }
        else if (wybor == '4')
        {
            wczytajAdresatowZPliku(adresaci);
            wyswietlAdresatow(adresaci,iloscAdresatow);
        }
        else if (wybor == '5')
        {

        }
        else if (wybor == '6')
        {

        }
        else if (wybor == '9')
        {
            cout << "Dziekuje za skorzystanie z ksiazki adresowej Lista Schindlera" << endl;
            cout << endl;
            exit(0);
        }
    }
    return 0;
}

Program ma zapisywać ludzi do pliku ale po wpisaniu pierwszej osoby program się wysypuje i zapisuje randomowe liczby do pliku. Już prosiłem o pomoc w jednym przypadku na forum tutaj: https://4programmers.net/Forum/C_i_C++/337741-c_wczytywanie_danych_wektor_struktur?p=1663271#id1663271. Z odczytem też jest problem - mimo, że jest kilka wpisów to nie chce odczytać mi ani jednego rekordu :/ już dwa dni nad tym dumam, kombinuję i nie mogę znaleźć błędu :/

3

Kod jest tak ogromnie chaotyczny, że właściwie trudno podać jakieś recepty. Np w policzAdresatow na trzy sposoby wprowadzasz plik, i używasz go totalnie niekonsekwentnie.
Praktycznie w każdej funkcji jest problem z parametrami, albo są nieprzemyślane, skopiowane z jedynie Partia wie czego itd...
Nie ma potrzeby w sąsiedztwie vectora<> dodawać jeszcze jakiś licznik, bo vector swój już ma ...

I wiele innych problemów

1

Nie umiem tego odpalić z powodu użytych bibliotek. W każdym razie nie używałbym zmiennej iloscAdresatow, łatwo wyjść poza zakres i sobie strzelić w stopę. Lepiej zrefaktorywować kod używając metody size() wektora. Może przy okazji znajdziesz błąd?
Warto też podawać wektory do funcji przez referencję: https://www.geeksforgeeks.org/passing-vector-function-cpp/

EDIT:
Napisz prostą funkcję która otwiera plik, pisze dopisuje do niego literę i zamyka plik. wykonaj 2 razy. Jeśli nie zadziała, znaczy że masz błąd w handlowaniu plików.

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