Problem z wczytaniem pliku

0

Piszę książkę adresową, która ma wyszukiwać zapisywać, wyszukiwać adresatów po imieniu, nazwisku oraz wyświetlać wszystkie osoby. Te dane mają być pobrane z pliku, który nie chce się wczytać. Przy zapisie osób plik się sam tworzy, a potem aby wyszukiwać trzeba go wczytać. Problemem jest to, że plik się nie wczytuje, bo program nie wyszukuje, ani nic nie wyświetla.

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

using namespace std;

struct Adresat {
    string imie, nazwisko, nrTel, email, adres;
    int idAdresata = 0;
};


std::vector <Adresat> adresaci;

void dodajOsobeDoKsiazki () {

    Adresat adresat;

    string imie = " ", nazwisko = " ", nrTel = " ", email = " ", adres = " ";
    int idOsoby;

    cout << "Podaj imie: ";
    cin >> adresat.imie;
    cin.sync();
    cout << "Podaj nazwisko: ";
    cin >> adresat.nazwisko;
    cin.sync();
    cout << "Podaj nr telefonu: ";
    getline(cin, adresat.nrTel);
    cin.sync();
    cout << "Podaj email: ";
    cin >> adresat.email;
    cin.sync();
    cout << "Podaj swoj adres: ";
    getline(cin, adresat.adres);

    idOsoby = adresaci.size();

    /*adresat.idOsoby = idOsoby;
    /*adresat.imie = imie;
    adresat.nazwisko = nazwisko;
    adresat.nrTel = nrTel;
    adresat.email = email;
    adresat.adres = adres;*/


    //dodaj osobe do wektora
    adresaci.push_back(adresat);


    //zapisz do pliku
    fstream plikDoZapisu;
    plikDoZapisu.open("blble.txt", ios::out | ios::app);

    if (plikDoZapisu.good() == true) {
        //plikDoZapisu.write(( char * ) & adresaci[ 0 ], adresaci.size() * sizeof( string ) );

        plikDoZapisu << adresat.idAdresata + 1 << "|" << adresat.imie << "|" << adresat.nazwisko << "|" << adresat.nrTel << "|" << adresat.email << "|" << adresat.adres << "|" << endl;
        plikDoZapisu.close();

    } else {
        cout << "Nie udalo sie otworzyc pliku";
        system("pause");
    }
    cout << "Osoba zostala dodana do ksiazki adresowej" << endl;
    system("pause");

}

vector <Adresat> rozdzielDaneAdresatowNaPojedynczeDane (vector <Adresat> &adresaci, string liniaDoOdczytania, char znakPionowejKreski) {
    Adresat adresat;
    int nrLinii = 1;
    int idAdresata = 0;
    stringstream ss(liniaDoOdczytania);
    string pojedynczaDana = " ";

    while (getline(ss, pojedynczaDana, znakPionowejKreski)) {
        switch (nrLinii) {
        case 1:
            adresat.idAdresata = (atoi(pojedynczaDana.c_str()));  break;
            //idOsoby = atoi(pomocnicza.c_str()); break;
        case 2:
            adresat.imie = pojedynczaDana;  break;
        case 3:
            adresat.nazwisko = pojedynczaDana; break;
        case 4:
            adresat.nrTel = pojedynczaDana;   break;
        case 5:
            adresat.email = pojedynczaDana;  break;
        case 6:
            adresat.adres = pojedynczaDana;  break;

        }
        nrLinii++;
    }
    //if() {
        adresaci.push_back(adresat);
    //}
    return adresaci;

}

int wczytajPlikZDanymiAdresatow (vector <Adresat> &adresaci) {
    int idAdresata = 0;
    string liniaTekstu;
    int nrLinii = 1;
    fstream plikDoOdczytu;
    string ostatniaOsobaWPliku = " ";

    plikDoOdczytu.open("blble.txt", ios::in);

    if (plikDoOdczytu.good() == true) {
        while (getline(plikDoOdczytu, liniaTekstu)) {
            //cout << liniaTekstu[2];
            adresaci = rozdzielDaneAdresatowNaPojedynczeDane(adresaci, liniaTekstu, '|');
        }
        //ostatniaOsobaWPliku = liniaTekstu;

        if (ostatniaOsobaWPliku != " ") {
          
            return idAdresata;
        }
        else
            idAdresata = 0;
    }
    plikDoOdczytu.close();

//    return adresaci;

}

void wyszukajOsobePoImieniu () {
    string imie;
    int iloscOsob = 0;
    vector <Adresat>::iterator itr = adresaci.begin();
    cout << "Podaj imie, ktore chcesz wyszukac: ";
    cin.sync();
    cin >> imie;
    cin.sync();

    for (itr; itr != adresaci.end(); itr++) {
        if(itr -> imie == imie) {
            cout << "Znalazlem osobe o takim imieniu";
            Sleep(1000);
            //iloscOsob++;
        }
        else {
            cout << "Nie ma takiej osoby";
            Sleep(1000);
        }

    }

}

void wyszukajOsobePoNazwisku () {
    string nazwisko;
    int iloscOsob = 0;
    vector <Adresat>::iterator itr = adresaci.begin();
    cout << "Podaj nazwisko, ktore chcesz wyszukac: ";
    cin.sync();
    cin >> nazwisko;
    cin.sync();

    for (itr; itr != adresaci.end(); itr++) {
        if(itr -> nazwisko == nazwisko) {
            cout << "Znalazlem osobe o takim nazwisku";
            //iloscOsob++;
            Sleep(1000);
        }

        else {
            cout << "Nie ma takiej osoby";
            Sleep(1000);
        }

    }

}

void wyswietlWszystkieKontakty () {
    vector <Adresat>::iterator itr = adresaci.begin();

    for (itr; itr != adresaci.end(); itr++) {
        cout << "ID: " << itr->idAdresata << endl;
        cout << "Imie: " << itr->imie << endl;
        cout << "Nazwisko: " << itr->nazwisko << endl;
        cout << "Nr tel: " << itr->nrTel << endl;
        cout << "Adres email: " << itr->email << endl;
        cout << "Adres zamieszkania: " << itr->adres << endl;
        Sleep(1500);
    }

}


int main() {
    std::vector <Adresat> adresaci;
    int liczbaZapisanychOsob;
    char twojWybor;

    sprawdzCzyPlikIstnieje ("blble.txt");
    wczytajPlikZDanymiAdresatow (adresaci);

    while (1)
    {
        system("cls");
        cout << "Witaj w ksiazce adresowej!" << endl;
        cout << "Wybierz opcje: " << endl;
        cout << "1. Dodaj adresata" << endl;
        cout << "2. Wyszukuj po imieniu" << endl;
        cout << "3  Wyszukuj po nazwisku" << endl;
        cout << "4. Wyswietl wszystkich adresatow" << endl;
        cout << "5. Usun adresata" << endl;
        cout << "6. Edytuj adresata" << endl;
        cout << "9. Zakoncz program" << endl;

        cin >> twojWybor;

        if (twojWybor == '1') {
            dodajOsobeDoKsiazki();
        }
        else if (twojWybor == '2') {
            wyszukajOsobePoImieniu();
        }
        else if (twojWybor == '3') {
            wyszukajOsobePoNazwisku();
        }
        else if (twojWybor == '4') {
            wyswietlWszystkieKontakty();
        }
        else if (twojWybor == '5') {
            //usunAdresata();
        }
        else if (twojWybor == '6') {
            wybierzOpcjeZMenuEdycjiUzytkownika();
        }
        else if (twojWybor == '9') {
            exit(0);
        }
    }
    return 0;
}
2

deklarujesz ponownie zmienną 'adresaci' w funkcji 'main', przykrywając w ten sposób zmienną globalną o tej samej nazwie

2

Duch Zelenta unosi się nad tym kodem ;)

std::vector <Adresat> adresaci;
...


int main() {
	std::vector <Adresat> adresaci;
	...
	
	wczytajPlikZDanymiAdresatow (adresaci);
	...

Zdecyduj się, jaka ma być zmienna adresaci - globalna czy lokalna. Teraz masz tak, że czytasz do lokalnej, a operujesz na globalnej.

adresaci = rozdzielDaneAdresatowNaPojedynczeDane(adresaci, liniaTekstu, '|');

Sensowniej by było, gdyby rozdzielDaneAdresatowNaPojedynczeDane zwracała wypełnioną strukturę Adresat a nie kopie wektora co każdą linie.

0

DZięki za pomoc. Ten problem rozwiązany. Poza tym program ciągle zapisuje adresatów z ID 1. Zmieniłam trochę funkcję dodajOsobeDoKsiazki, ale nadal każdy ma ID 1.

int dodajOsobeDoKsiazki () {

    Adresat adresat;

    string imie = " ", nazwisko = " ", nrTel = " ", email = " ", adres = " ";
    int idOsoby;
    int iloscOsob = 0;

    adresat.idAdresata = iloscOsob + 1;

    cout << "Podaj imie: ";
    cin >> adresat.imie;
    cin.sync();
    cout << "Podaj nazwisko: ";
    cin >> adresat.nazwisko;
    cin.sync();
    cout << "Podaj nr telefonu: ";
    getline(cin, adresat.nrTel);
    cin.sync();
    cout << "Podaj email: ";
    cin >> adresat.email;
    cin.sync();
    cout << "Podaj swoj adres: ";
    getline(cin, adresat.adres);


    //dodaj osobe do wektora
    adresaci.push_back(adresat);


    //zapisz do pliku
    fstream plikDoZapisu;
    plikDoZapisu.open("blble1.txt", ios::out | ios::app);

    if (plikDoZapisu.good() == true) {
        //plikDoZapisu.write(( char * ) & adresaci[ 0 ], adresaci.size() * sizeof( string ) );

        plikDoZapisu << adresat.idAdresata << "|" << adresat.imie << "|" << adresat.nazwisko << "|" << adresat.nrTel << "|" << adresat.email << "|" << adresat.adres << "|" << endl;
        plikDoZapisu.close();

    } else {
        cout << "Nie udalo sie otworzyc pliku";
        system("pause");
    }
    cout << "Osoba zostala dodana do ksiazki adresowej" << endl;
    system("pause");

    return iloscOsob + 1;

int main() {

    int liczbaZapisanychOsob;
    char twojWybor;

   
    wczytajPlikZDanymiAdresatow (adresaci);

    while (1)
    {
        system("cls");
        cout << "Witaj w ksiazce adresowej!" << endl;
        cout << "Wybierz opcje: " << endl;
        cout << "1. Dodaj adresata" << endl;

        cin >> twojWybor;

        if (twojWybor == '1') {
            dodajOsobeDoKsiazki();
        }
        
    }
    return 0;
}
0
Magda Pietrzykowska napisał(a):

Zmieniłam trochę funkcję dodajOsobeDoKsiazki, ale nadal każdy ma ID 1.

    int iloscOsob = 0;

    adresat.idAdresata = iloscOsob + 1;

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