用cin检测输入结束

时间:2014-01-29 01:27:12

标签: c++ user-input

我想从用户那里读取一行整数。我不知道如何检查输入是否已经结束。例如,我希望能够做类似

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

输入示例:2 1 4 -6

如何检查cin是否还有其他内容?

6 个答案:

答案 0 :(得分:4)

非常简单。您需要做的就是执行提取作为条件:

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>{}};

答案 1 :(得分:4)

如果cin仍然是交互式的,那么就没有“不再输入”的概念,因为它只会等待用户提供更多输入(除非用户已使用发信号通知EOF Ctrl + D Ctrl + Z (视情况而定)。如果你想处理一行数据,那么从用户那里得到一行(比如getline),然后处理那个输入(通过从字符串流中提取或类似)。

答案 2 :(得分:3)

哟必须做以下事情

int temp;

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

您也可以使用

检查输入结束
if(cin.eof()){
    //end of input reached
}

答案 3 :(得分:1)

使用fstream可以执行以下操作

ifstream ifile("input.txt");
while(!ifile.eof())
{
    /* do something */
}

您也可以使用此

if(!ifile.is_open())
{
   /* do something */
}

答案 4 :(得分:0)

下面的代码是silimar的想法,因此您可以尝试:

int tmp;
while(cin >> tmp != NULL){ // C++ or while(scanf("%d", &tmp) != -1) {} for C
     // do something
}

答案 5 :(得分:0)

我通常在下面检测cpp流的结尾:

while (cin.peek() != EOF) {
  // To do your stuff...
  // NOTE: peek() will set failbit when peeking end of stream and return EOF(-1).
}