2016-12-17 8 views
0

У меня возникли проблемы с печатью вектора моего собственного класса, vector<Data> data;.Оператор C++ << перегрузка не распечатывается вектор

Короче говоря, я работаю на классе class Data_proc, он имеет конструктор по публике:

explicit Data_proc(const string& n, istream& is) 
{ 
    Data temp; 
    while(is >> temp) 
     this->data.push_back(temp); 
} 

Я также перегружен operator<< для печати:

friend ostream& operator<<(ostream& os, const Data_proc& dp) 
{ 
    os << "Person: " << dp.name 
     << "\nnumber: " << dp.number; 

    copy(dp.data.begin(), dp.data.end(), ostream_iterator<Data>(cout)); 

    return os; 
} 

Проблема здесь состоит в том, что код компилируется без каких-либо проблем, но ничто из вектора данных не выводится на консоль. Однако, когда я изменил свой конструктор следующим образом, он работает, частично:

Data temp; 
    is >> temp; 
    data.push_back(temp); 

Но, как вы могли бы заподозрить, это только печатает первые «пары», а остальные данные, которые были прочитаны из файла является отбрасывать. Что я сделал не так? Почему не осталось while -loop из файла? Любая помощь приветствуется! Если вам нужны детали о class Data, дайте мне знать!

Edit: operator>> для данных, где у меня есть string staffName и vector<int> passCode:

friend istream& operator>>(istream& is, Data& d) 
{ 
    getline(is, d.staffName, '\n'); 

    int temp; 
    while(is >> temp) 
     d.passCode.push_back(temp); 

    return is; 
} 

Я могу вставить фрагмент, как содержание входного файла выглядит, как если бы это тоже нужно!

Edit 2: Добавлена ​​operator<< для class Data:

friend ostream& operator<<(ostream& os, const Data& d) 
{ 
    os << d.staffName<< "\n"; 
    copy(d.passCode.begin(), d.passCode.end(), ostream_iterator<int>(cout, " ")); 
    return os; 
} 

Edit 3: Сделано новое operator>>:

getline(is, d.staffName, '\n'); 

    string results; 
    getline(is, results, '\n'); 
    istringstream iss(results); 

    int val; 
    while(iss >> val) 
     d.passCode.push_back(val); 

    return is; 
+0

Где 'operator >>' для 'Data'? Пожалуйста, опубликуйте [mcve]. – PaulMcKenzie

+0

@PaulMcKenzie Я добавил 'operator >>'. Извините за длинный код. – user3941584

+0

@MikelF Вы имеете в виду, как 'operator >>' использовался в 'main()'? – user3941584

ответ

2

В вашей operator>>

while(is >> temp) 
    d.passCode.push_back(temp); 

Это читает Интс из потока до отказа. Итак, независимо от того, выполняется ли она до конца потока или пока он не попытается прочитать что-то, что не может интерпретироваться как int, поток, как гарантируется, будет находиться в состоянии сбоя, когда время закончится. Это означает, что в вашем конструкторе выражение is >> temp будет сообщать о сбое, независимо от содержимого файла, и никакие элементы не будут помещены в вектор.

+0

Ум, хорошо. Мои входные файлы содержат первые строки, а затем целые числа и повторяются. Я убедился, что строка читается 'getline()', поэтому осталось только целое число, которое нужно прочитать, пока не появится следующая строка? – user3941584

+0

Что лучше, если я должен прочитать строку строки и повторить цепочку целых чисел? – user3941584

+0

@ user3941584: Используйте getline для строки, а затем снова для целых чисел (т. Е. Прочитайте все целые числа в строке в одну строку). Затем используйте 'istringstream' для чтения из этой строки в серию int (так же, как вы делаете сейчас из исходного потока). –