Отталкивание объекта в список в C ++ - PullRequest
0 голосов
/ 12 января 2020

У меня проблема с возвратом объекта в список объектов.

std::ostream& operator << (std::ostream& os, const Class1& sk) {
    os << sk.X << 'x' << sk.Y << 'x' << sk.H << ';' << sk.a << ';' << sk.b << '\n';
    return os;
}

std::istream& operator >> (std::istream& is, Class1& sk) {
    char ch;
    is >> sk.X >> ch >> sk.Y >> ch >> sk.H >> ch >> sk.a >> ch >> sk.b >> ch;
    return is;
}

void Class1::GetSK_list(std::list<Class1>& SK_list) {
    std::ifstream file("file.txt", std::ios::in);
    std::list<Class1>::iterator iter = SK_list.begin();
    while(file >> *iter) {
        "std::cout << *iter"; // checking
        SK_list.push_back(*iter);
        iter++;
    }
    file.close();
}

void Class1::SaveSK_list(std::list<Class1>& SK_list) {
    std::ofstream file("file.txt", std::ios::out);
    for(std::list<Class1>::iterator iter = SK_list.begin(); iter != SK_list.end(); iter++)
        file << *iter;
    file.close();
}

Когда я использую функцию SaveSK_list, она работает правильно.

Проблема в функции GetSK_list. Если в файле есть одна строка (например, 1x2x3; 4; 5), файл >> * не работает. Там ничего не напечатано (я считаю, что std :: cout << * iter никогда не достигается). </p>

Если в файле более одной строки, печатается только самая первая. После этого появляется ошибка std :: bad_allo c.

Кстати. эти функции находятся в Class1, чтобы использовать перегрузку операторов.

1 Ответ

0 голосов
/ 12 января 2020

Вы можете использовать итератор вставки , который автоматически вызовет push_back() в списке:

void GetSK_list(std::list<Class1>& SK_list) {
    auto iter = std::back_inserter(SK_list);

    std::ifstream file("file.txt", std::ios::in);
    Class1 tmp;
    while(file >> tmp) {
        *iter++ = tmp;
    }
    file.close();
}

Вы можете сделать еще лучше, комбинируя с istream_iterator и copy алгоритм:

void GetSK_list(std::list<Class1>& SK_list) {
    std::ifstream file("file.txt", std::ios::in);
    std::copy(std::istream_iterator<Class1>(file),
              std::istream_iterator<Class1>(),
              std::back_inserter(SK_list));
}

Также нет необходимости звонить file.close(); файл закрыт в деструкторе ifstream.

...