C++ четене на ред

HerpaMoTeH

Registered
Имам следната ситуация: файл с 1 ред, който има следната структура:
Name1 day1 month1 year1 Name2 day2 month2 year2 ...
Как мога да прочета реда, така че да създам вектор от обекти тип Human(name, day, month, year) ?
 
Ми правиш си клас Human, предефинираш му оператора >> за четене със CIN:

istream& operator >> (istream& in)
{
in >> name >> day >> month >> year;

return in;
}

И ги четеш в цикъл:
while (!cin.eof())
{
Human human;

cin >> human;
vector.push_back(human);
}
 
Направил съм класа, предефинирал съм оператора:
PHP:
istream& CStudent::operator>>(istream &in){
    int d,m,y;
    in >> name >> d >> m >> y;
    date.setDay(d);
    date.setMonth(m);
    date.setYear(y);
    return in;
}

Четенето и пълненето на контейнера го правя по следния начин :
PHP:
CStudent::CStudent(list<CStudent> students,string path){
    ifstream a(path.c_str());
    CStudent s();
    int d=1,m=1,y=1990;
    if(a.is_open()){
        while (!a.eof()) {
            a >> s;
            students.push_back(s);
        }
    }else{
        cout << "File does not exist." << endl;
        exit(1);
    }
    a.close();
}

Избива ми следната грешка:
Код:
error: ambiguous overload for ‘operator>>’ in ‘a >> s’|
 
Ох извинявай подвел съм те малко. Оператора трябва да е извън класа (да не е метод) и да изглежда така:

istream& operator>>(istream &in, CStudent& st){
int d,m,y;
in >> st.name >> d >> m >> y;
st.date.setDay(d);
st.date.setMonth(m);
st.date.setYear(y);
return in;
}

Но ако искаш можеш да си го сложиш и директно този код в цикъла директно да ги четеш по същия начин.
 
PHP:
istream& operator>>(istream &in, CStudent &ob){
    int d,m,y;
    in >> ob.name >> d >> m >> y;
    ob.date.setDay(d);
    ob.date.setMonth(m);
    ob.date.setYear(y);
    return in;
}

CStudent::CStudent(list<CStudent> students,string path){
    ifstream a(path.c_str());
    string na;
    CStudent s;
    int d=1,m=1,y=1990;
    if(a.is_open()){
        while (!a.eof()) {
            a >> s;
            students.push_back(s);
        }
    }else{
        cout << "File does not exist." << endl;
        exit(1);
    }
    a.close();
}
В момента избива грешка в list библиотеката на STL.
 
Код:
|  required from ‘std::list<_Tp, _Alloc>::_Node* std::list<_Tp, _Alloc>::_M_create_node(const value_type&) [with _Tp = CStudent; _Alloc = std::allocator<CStudent>; std::list<_Tp, _Alloc>::_Node = std::_List_node<CStudent>; std::list<_Tp, _Alloc>::value_type = CStudent]’|
 
Оправих проблема. Оказа се, че gcc има задължителе синтаксис на копи констуктура:
PHP:
CStudent(const CStudent &ob);
Тази дума const ми зе нервите :D
 
Още една от тъпите грешки на C++. Днес се пуля 10 минути на 1 код защо не работи. Избива някъде в системните хедъри, накрая се оказва, че просто съм изпуснал #include <string>, а го ползвам. И грешката не е там където правя инстанция на string (и да ми избие с Incomplete type ...), а на ******* си. Иди го разбери.
 

Back
Горе