• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapisywanie do pliku obiektów struktury

42 Warsaw Coding Academy
0 głosów
408 wizyt
pytanie zadane 20 września 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)

Piszę książkę adresową, używając struktur i wektora i chcę zapisać obiekty struktury do pliku. Po wpisaniu danych w konsoli, plik się tworzy, ale zamiast danych zapisuje się przypadkowa liczba oraz kilka ||||. 

Jak można to rozwiązać?

 

#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 idOsoby = 0;
};


std::vector <Adresat> adresaci;

int 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);


    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.idOsoby << "|" << 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");

}


int main() {

    std::vector <Adresat> adresaci;
    int liczbaZapisanychOsob = 0;
    char twojWybor;

    //liczbaZapisanychOsob = wczytajOsobyZPlikuTekstowego (adresaci);

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

        cin >> twojWybor;

        if (twojWybor == '1') {
            liczbaZapisanychOsob = dodajOsobeDoKsiazki();
        }
     
        else if (twojWybor == '9') {
            exit(0);
        }
    }


    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 20 września 2020 przez tangarr Mędrzec (155,180 p.)
Masz kilka błędów w funkcji dodajOsobeDoKsiazki

1. Zmienna idOsoby jest niezainicjowana
2. Zmienne imie, nazwisko, nrTel, email, adres nie mają przypisanej wartości
3. Dane wczytujesz bezpośrednio do struktury a następnie nadpisujesz je pustymi napisami (z punktu 2)
komentarz 21 września 2020 przez magda_19 Gaduła (3,080 p.)

Dzięki, już rozwiązane, ale przy zapisie idOsoby się nie zwiększa. Każdą osobę zapisuje z id 1.

 

#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 idOsoby = 0;
};


std::vector <Adresat> adresaci;

int dodajOsobeDoKsiazki () {

    Adresat adresat;

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

    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);


     /*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.idOsoby + 1 << "|" << adresat.imie << "|" << adresat.nazwisko << "|" << adresat.nrTel << "|" << adresat.email << "|" << adresat.adres << "|" << endl;

        idOsoby++;

        plikDoZapisu.close();


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

}


int main() {

    std::vector <Adresat> adresaci;
    int liczbaZapisanychOsob;
    char twojWybor;

    liczbaZapisanychOsob = wczytajOsobyZPlikuTekstowego (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') {
            liczbaZapisanychOsob = dodajOsobeDoKsiazki();
        }
    
    }


    return 0;
}

 

komentarz 21 września 2020 przez tangarr Mędrzec (155,180 p.)
Zmienna idOsoby jest zmienną lokalną funkcji. Inkrementacja tej zmienne w linii 58 miałaby sens gdyby zmienna była statyczna (zmienna inicjalizowana tylko przy pierwszym wywołaniu funkcji).
Lepszym rozwiązaniem będzie przypisanie do zmiennej idOsoby długości wektora adresaci.

Podobne pytania

0 głosów
1 odpowiedź 289 wizyt
0 głosów
3 odpowiedzi 716 wizyt
pytanie zadane 27 kwietnia 2019 w C i C++ przez miodowy Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 702 wizyt
pytanie zadane 12 września 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)

93,389 zapytań

142,386 odpowiedzi

322,549 komentarzy

62,750 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...