間違ったイテレータを使用しています。
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_iterator
char
wchar_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>());
この場合、追加のブレースは必要ありません。
それが役立つことを願っています。