間違ったイテレータを使用しています。
istreambuf_iteratorではなく、が必要ですostreambuf_iterator。
std::copy(std::istreambuf_iterator<int>(out.rdbuf()),
std::istreambuf_iterator<int>(), std::back_inserter(numbers));
ostreambuf_iteratorは出力イテレータであることに注意してください。読み取りではなく、書き込みに使用されます。あなたがしたいことは、あなたが必要とするものを読むことです。istreambuf_iterator
ちょっと待って!上記のコードも機能しません。なぜですか?
あなたがそれを使用istreambuf_iteratorして渡しintているからです。は、 または のいずれかのタイプのフォーマットされていないバッファistreambuf_iteratorとしてデータを読み取ります。へのテンプレート引数は、 または のいずれかです。char*wchar_t*istreambuf_iteratorcharwchar_t
実際に必要なのは、指定されたタイプのフォーマットされたデータistream_iteratorを読み取る呼び出しです。
std::copy(std::istream_iterator<int>(out), //changed here also!
std::istream_iterator<int>(), std::back_inserter(numbers));
これでうまくいきます。
の使用を避け、それ自体std::copyのコンストラクターを次のように使用できることに注意してください。std::vector
std::fstream in("out.txt");
std::vector<int> numbers((std::istream_iterator<int>(in)), //extra braces
std::istream_iterator<int>());
最初の引数を囲む余分な括弧に注意してください。これは、C++++ での面倒な解析を避けるために使用されます。
ベクトル オブジェクトが既に作成されている場合 (およびオプションでいくつかの要素が含まれている場合)、次のように回避できますstd::copy。
numbers.insert(numbers.end(),
std::istream_iterator<int>(in), //no extra braces
std::istream_iterator<int>());
この場合、追加のブレースは必要ありません。
それが役立つことを願っています。