我想从用户那里读取一行整数。我不知道如何检查输入是否已经结束。例如,我希望能够做类似
的事情int x[MAX_SIZE];
int i = 0;
while(cin.hasNext())
{
cin >> x[++i];
}
输入示例:2 1 4 -6
如何检查cin
是否还有其他内容?
答案 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).
}