2016-12-17 5 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がファイルから読み続けるのはなぜですか?どんな助けもありがとう!​​に関する詳細が必要な場合は、お知らせください。

編集:私はstring staffNamevector<int> passCodeを持っているデータについてoperator>>

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

ここで、 'データ'に対して '演算子>>'はありますか? [mcve]を投稿してください。 – PaulMcKenzie

+0

@PaulMcKenzie私は 'operator >>'を追加しました。長いコードを申し訳ありません。 – user3941584

+0

@MikelF 'main()'で 'operator >>'が使われた方法を意味しますか? – user3941584

答えて

2

あなたoperator>>

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

これは、ストリームからint型を読み込みます失敗するまで。したがって、ストリームの最後まで実行されようと、intとして解釈できないものを読み込もうとするまで、関数の終了時にストリームは失敗状態になることが保証されます。つまり、コンストラクタでは、式is >> tempはファイルの内容に関係なく失敗したものとしてレポートされ、ベクトルには何も入れられません。

+0

うん、いいよ。私の与えられた入力ファイルには、最初の文字列とその後の整数が含まれ、繰り返します。私は文字列が 'getline()'によって読み込まれていることを確認しました。次の文字列が現れるまで読み込む整数だけが残っています。 – user3941584

+0

文字列の行と整数の行を繰り返し読み込む方が良い方法はありますか? – user3941584

+0

@ user3941584:文字列にはgetl​​ineを使用し、次に整数については(つまり、行のすべての整数を単一の文字列に読み込む)その後、その文字列を一連のintに読み込むために 'istringstream'を使います(元のストリームからやっているのと同じ方法で)。 –

関連する問題