1

私は C++ を初めて使用します。これがばかげた質問である場合は申し訳ありません。なぜこれが機能しないのか理解できないようです。最初のベクトルにコピーし、2 番目のコピー呼び出しをスキップするようです。

#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

int main ()
{
    vector<int> first;
    vector<int> second;

    copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(first));
    cin.clear();
    copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(second)); 
    return 0;
}

copy 関数を使用して、 istream_iterator 入力を任意の数のベクトルに読み取りたい (ベクトルごとに 1 回呼び出してコピーする)。つまり、コンソールに「1 2 3 4 5 ctrl+d」と入力して、最初のベクトルに 1,2,3,4,5 を入力できるようにしたいと考えています。次に、コンソールに「6 7 8 9 10 ctrl+d」と入力し、2 番目のベクトルに 6,7,8,9,10 を入力します。

問題は、最初のベクトルに何らかの入力を入力して control+d を押した後、cin の失敗状態に関係なく、cin の istream_iterator が istream_iterator() と同じままであることです。これにより、以降のすべての「copy」呼び出しが失敗します (istream_iteratorcin は、プログラムが eof として解釈する istream_iterator() と既に等しいため)。私の質問は次のとおりです。cinストリームとともにイテレータを「リセット」するにはどうすればよいですか? cin.clear() は実際にすべての失敗ビットをクリアしています。ただし、 istream_iterator(cin) は istream_iterator() と同じです。私が理解していることから、ストリームにバインドされている istream_iterators は、ストリームが失敗状態にある場合にのみ、デフォルトの istream_iterator 値と等しくなければなりません。私は何が欠けていますか?

4

1 に答える 1

3

入力イテレータistream_iteratorです。つまり、各イテレータ値を逆参照できるのは1回だけです。あなたは文字通りストリームから読んでいて、探したり戻ったりすることはありません。したがって、ストリームの終わりに達すると、入力するものは何もなくなり、2番目の範囲は空になります。

vector<int> second(first);コピーを作ると言ってみませんか?


更新:質問を明確にした後、新しい答えがあります:あなたはどのように機能するかを誤解してstdinいます。入力は1つだけです。Ctrl-DC++に固有のものではありません。むしろ、それはあなたのプラットフォームの慣習であり、あなたが信号を送るとあなたのプラットフォームは入力バッファを終了しますCtrl-D。その後、入力された「ファイル」が終了し、それ以上データを書き込むことができなくなります。

しかし、あなたのアプローチは少し異例です。通常は、行ごとに、で区切って読み取り、各行Enterをトークン化します。文字列ストリームを使用すると、非常によく似たコードが得られます。

std::string line;
std::vector<int> first, second;

// Read line 1
if (std::getline(std::cin, line))
{
  std::istringstream iss(line);
  std::copy(std::istream_iterator<int>(iss), std::istream_iterator<int>(), std::back_inserter(first));
}
else { /* error */ }

// Read line 2
if (std::getline(std::cin, line))
{
  std::istringstream iss(line);
  std::copy(std::istream_iterator<int>(iss), std::istream_iterator<int>(), std::back_inserter(second));
}
else { /* error */ }
于 2011-09-15T18:40:47.147 に答える