[C++] Wczytywanie danych - wektor struktur

0

Witam, chciałbym poprosić o wytłumaczenie jednej kwestii, walczę w tej chwili z takim kodem:

#include <iostream>
#include <vector>

using namespace std;

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


int main()
{
    vector < Adresat > adresat;
    Adresat pobrane;
    string daneAdresata = " ";
    cout << "Podaj: ";
   
    while( getline( cin, daneAdresata, '|' ) )
    {
        cout << "imie" << pobrane.imie;
        cout << "nazwisko" << pobrane.nazwisko;
        cout << "nr_tel" << pobrane.nr_tel;
        cout << "email" << pobrane.email;
        cout << "adres" << pobrane.adres;
    }
    adresat.push_back( pobrane );
   
    return 0;
}

popełniłem swojego czasu książkę adresową i chciałem ją troszkę przerobić - przerzucić się na wektor i teraz cały zamysł polega na tym, żeby wpisywane dane (a dokładniej odczytywane z pliku - funkcję zapisującą dane do pliku już mam) oddzielane pionową kreską np. Bob|Budowniczy|123 456 789|[email protected]|ul. Budowy 36; 11-222 Budulec| były przypisane do kolejnych elementów zmiennej pobrane, oraz wpisane jako kolejny element wektora. Generalnie chciałbym wprowadzonego stringa rozdzielić na pojedyncze dane (imie, nazwisko itd.)i przypisać do odpowiednich pól obiektu pobrane.

1

Przeładuj operator>> dla istream i Twojej struktury.

2

W głównej pętli nie stosuj delimitera, tylko:

while( getline( cin, daneAdresata) )
{
...
}

Pozwoli Ci to wczytać cały rekord, a nie jego jeden element.
Teraz, wewnątrz tej pętli masz string daneAdresata postaci Bob|Budowniczy|23456|email|adres. Aby podzielić go na tokeny, możesz zastosować jakieś funkcje z boosta (np split), ale zapewne nie chcesz dołączać boosta do małego projektu, więc możesz to zrobić np. tak:

void split(const std::string& str, std::vector<std::string>& cont, char delim = '|')
{
    std::stringstream ss(str);
    std::string token;
    while (std::getline(ss, token, delim)) {
        cont.push_back(token);
    }
}

Masz już funkcję, która dzieli Ci rekord wejściowy na tokeny. Pozostaje Ci sprawdzenie poprawności (czy np. masz tyle tokenów w cont ile pól w rekordzie) i przypisanie kolejnych tokenów do pól struktury Adresat.

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