2016-12-17 86 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不從文件中讀取數據?任何幫助表示讚賞!如果您需要關於​​的詳細信息,請告訴我!

編輯:operator>>數據,在那裏我有string staffNamevector<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; 
} 

我可以粘貼的輸入文件的內容的樣子,如果它也需要一個片段!

編輯2:新增operator<<爲​​:

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; 
} 

編輯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 >>'在哪裏?請發佈[mcve]。 – PaulMcKenzie

+0

@PaulMcKenzie我已經添加了'operator >>'。對不起,長碼。 – user3941584

+0

@MikelF你的意思是如何在'main()'中使用'operator >>'? – user3941584

回答

2

在你operator>>

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

這從流中讀取整數直到失敗。因此,無論它運行到流的末尾,還是直到它嘗試讀取不能被解釋爲int的內容時,流保證在函數結束時處於失敗狀態。這意味着在您的構造函數中,無論文件的內容如何,​​表達式is >> temp都將報告爲失敗,並且不會將任何項放入向量中。

+0

嗯,好吧。我給定的輸入文件包含第一個字符串,然後是整數,然後重複。我確定該字符串正在被'getline()'讀取,所以只剩下一個整數,直到下一個字符串出現爲止,對吧? – user3941584

+0

如果我要讀取一行字符串和一行重複的整數,那麼更好的方法是什麼? – user3941584

+0

@ user3941584:對字符串使用getline,然後再使用getline(即將一行上的所有整數讀入一個字符串)。然後使用'istringstream'從該字符串讀取一系列整數(與現在使用原始流相同的方式)。 –