3

3 つの行に 3 つの int があるファイルがあります。次のようになります。

000
001
010

そして、各整数をベクトル位置に読み込もうとしていますが、それが正しいかどうかはわかりません。これが私のコードです:

#include <fstream>
#include <iterator>
#include <vector>

int main()
{
   std::vector<int> numbers;
   std::fstream out("out.txt");

   std::copy(std::ostreambuf_iterator<int>(out.rdbuf()),
             std::ostreambuf_iterator<int>(), std::back_inserter(numbers));
}

ここで何が間違っていますか?コピーを行う行で「一致する関数呼び出しがありません」というエラーが表示されます。

4

2 に答える 2

10

間違ったイテレータを使用しています。

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>());

この場合、追加のブレースは必要ありません。

それが役立つことを願っています。

于 2013-03-29T14:37:23.953 に答える
0

書籍「C++ How To Program」(Dietal & Dietal 著) のベクトルに関する章を読んでください。すべての問題が解決されることを保証します。入力ではなく出力用にテキスト ファイルを開いています。この関数を使用する代わりに、ファイルで EOF が検出されるまで、文字列を読み込み、イテレータを使用してベクターにコピーすることをお勧めします。編集: ベクトルを初めて使用する場合、この方法はより自然で読みやすく、理解しやすいです。

于 2013-03-29T14:37:54.423 に答える