web-dev-qa-db-ja.com

cinで入力の終わりを検出する

ユーザーから整数の行を読み取りたい。入力が終了したかどうかを確認する方法がわかりません。たとえば、私は次のようなことができるようになりたいです

int x[MAX_SIZE];
int i = 0;
while(cin.hasNext())
{
  cin >> x[++i];
}

入力例:2 1 4 -6

cinが必要なものが他にあるかどうかを確認するにはどうすればよいですか?

6
Celeritas

あなたは次のことをしなければなりません

int temp;

vector<int> v;
while(cin>>temp){
    v.Push_back(temp);
}

また、を使用して入力の終了を確認することもできます

if(cin.eof()){
    //end of input reached
}
5
Miguel Carvajal

それは非常に簡単です。あなたがする必要があるのは条件として抽出を実行することです:

while (i < MAX_SIZE && std::cin >> x[i++])

何らかの理由(文字が残っていない、無効な入力など)で抽出が失敗した場合、ループは終了し、失敗は入力ストリームのストリーム状態で表されます。

ベストプラクティスを考慮すると、静的C配列を使用するべきではありません。コンパイル時コンテナを使用する必要があります std::array<T, N> (または、前者がサポートされていない場合は std::vector<T> )。

std::vectorを使用した例を次に示します。また、入力のコピーを明示的に作成する必要がないイテレータを利用します。

std::vector<int> v{ std::istream_iterator<int>{std::cin},
                    std::istream_iterator<int>{}};
4
0x499602D2

cinがまだインタラクティブである場合、ユーザーがより多くの入力を提供するのを待つだけなので、「これ以上入力がない」という概念はありません(ユーザーがEOFに信号を送った場合を除く) Ctrl+D または Ctrl+Z 適切に)。データの行を処理する場合は、ユーザーから行を取得し(たとえば、getlineを使用)、その入力を処理します(文字列ストリームなどから抽出します)。

4
tabstop