[C++] Wczytywanie danych - wektor struktur

[C++] Wczytywanie danych - wektor struktur
BI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5
0

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

Kopiuj
#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|bob@budowniczy.pl|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.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
1

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

GS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1265
2

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

Kopiuj
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:

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.