Problem z dodawaniem do vectora
Ostatnio zmodyfikowano 2016-03-08 21:52
Garniturek Temat założony przez niniejszego użytkownika |
Problem z dodawaniem do vectora » 2016-03-08 18:07:14 Witam, chcę wczytać dane do programu z pliku.txt, w którym są dane 'Bla bla, M, 124, Matma, 5, 6'. Coś mam źle ponieważ w czasie próby pojawia mi się error: "Expression: list iterator not dereferencable". Chodzi o iterator listy list<cStudent> studenci; Proszę o pomoc! struct sOcena { string przedmiot; float ocena; float ECTS; }; class cStudent { string m_imieNazwisko; char m_plec; int m_nrIndeksu; public: vector < sOcena > m_ocena; cStudent(); cStudent( string imieNazwisko, char plec, int nrIndeksu ); void pobierz(); void wyswietl(); void pobierz_oceny(); int prog_ECTS(); vector < sOcena > oceny( string nazwa, int rosnaca ); float srednia(); void sort_ocene(); void zapisz(); }; void wczytaj( list < cStudent > studenci );
void wczytaj( list < cStudent > studenci ) { string a, d; char b; float c, e, f; fstream plik; plik.open( "Dane studentów.txt", ios::in ); string line; int wers = 0; while( getline( plik, line ) ) { auto v = studenci.begin(); int couter = 0; string cell; stringstream line_stream( line ); int licznik = 0; while( getline( line_stream, cell, ',' ) ) { if( couter == 0 ) { cout << cell << " "; if( licznik == 0 ) a = cell; else if( licznik == 1 ) b = cell[ 0 ]; else if( licznik == 2 ) { c = stof( cell ); cStudent tmp( a, b, c ); studenci.push_back( tmp ); } else if( licznik > 2 ) { sOcena zam; if( licznik == 3 ) { zam.przedmiot = cell; } else if( licznik == 4 ) zam.ocena = stof( cell ); else if( licznik == 5 ) { zam.ECTS = stof( cell ); v->m_ocena.push_back( zam ); licznik = 2; } } cout << licznik; licznik++; } } cout << endl; } plik.close(); }
|
|
carlosmay |
» 2016-03-08 20:10:23 auto v = studenci.begin(); v->m_ocena.push_back( zam ); int c;
c = stoi( cell ); cStudent tmp( a, b, c );
Wczytywałbym bez zbędnych konwersji: { int id, oc_1, oc_2; string tekst, przedmiot; char znak; getline( plik, tekst, ',' ); plik >> znak; plik.get(); plik >> id; plik.get(); getline( plik, przedmiot, ',' ); plik >> oc_1; plik.get(); plik >> oc_2; plik.get(); }
Konstruktorem przekazał wszystkie dane i tam je rozdzielił do poszczególnych składowych. Taki konstruktor daje możliwość wywołania w każdym miejscu bez konieczności uzupełniania składowych w miejscu wywołania. |
|
Garniturek Temat założony przez niniejszego użytkownika |
» 2016-03-08 21:52:20 Dzięki wielkie!! Co do twojej propozycji, poczytam o funkcji get() i wypróbuję przy następnym zadaniu ;) |
|
« 1 » |