Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z dodawaniem do vectora

Ostatnio zmodyfikowano 2016-03-08 21:52
Autor Wiadomość
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!
C/C++
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(const cStudent& s);
    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 );
C/C++
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();
}
P-145734
carlosmay
» 2016-03-08 20:10:23
C/C++
auto v = studenci.begin(); // w zlym miejscu, daj tak
v->m_ocena.push_back( zam );

C/C++
int c; // powinna byc int bo tak jest w klasie
// ...
c = stoi( cell ); // na int (bo w klasie jest int nie float
cStudent tmp( a, b, c ); // unikamy w ten sposob niejawnej konwersji float na int (utrata precyzji)

Wczytywałbym bez zbędnych konwersji:
C/C++
{ 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();
    // uzycie konstruktora
}
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.
P-145751
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 ;)
P-145765
« 1 »
  Strona 1 z 1