我想知道是否可以有多个while (cin>>(variable))
,如下面的代码所示:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v1, v2;
int input;
while (cin>>input)
v1.push_back(input);
while (cin>>input)
v2.push_back(input);
return 0;
}
我的程序的逻辑是让用户在两组int向量中定义元素的数量和每个元素的值。
然而,我意识到在输入第一个向量的第一组数字(以EOF结尾)后,我无法输入第二个向量的第二组数字,程序会立即终止。我怀疑EOF意味着第一个向量的第一个cin也被第二个cin处理为第二个向量。
上面的程序有没有办法正确运行,即有多个while(cin)?
答案 0 :(得分:2)
您需要在使用EOF(即 CTRL-D 或 CTRL-Z )结束后调用cin.clear();
,以便重新使用它。
答案 1 :(得分:2)
执行while (cin>>input)
时,您实际上要求输入流cin
生成整数,直到流变坏(即遇到EOF,蒸汽无法将用户的输入转换为整数,或者可能还有另一个问题)。
循环终止后,流的状态仍然处于导致循环停止的任何状态。为了继续从cin
读取直到遇到另一个EOF令牌,您需要首先清除eof失败位,这可以通过使用cin.clear()
来完成(如πάνταῥεῖ指出)。但是,您应首先检查cin
的状态,以防输入因其他原因而失败(可能是用户输入的是单词而不是数字)。
可能有两个选项:检查是否只设置了eof位,或者只能取消设置eof位:
if (cin.eof())
{
std::cout << "Yay, reached an EOF" << std::endl;
}
cin.clear(std::ios_base::eofbit);
答案 2 :(得分:1)
此while循环读取,直到到达文件末尾。 结束后没有其他内容,因此任何进一步的阅读都将失败。
当第一组数字结束时,您必须设计另一种方式,以便您的程序知道(即,具有条件)。
通常有两种选择:
首先读取值的数量
int count;
std::cin >> count;
for (int i = 0; i < count; i++) {
std::cin >> input;
v1.push_back(input);
}
// read into v2 …
或具有分隔值,即无效的特殊值。在这种情况下,我会将负数视为无效。
std::vector<int> *v_input = &v1; // first read to v1
while (std::cin << input) {
if (input >= 0)
v_input->push_back(input);
else {
// invalid value, thus push numbers to the next vector
if (v_input == &v1)
v_input = &v2;
else
// invalid value while reading values for v2 - do not read any more lines
break;
}
}
但是,您也可以先将整行读作字符串并进行测试,例如,如果字符串为空。如果是,请将值输入v2
而不是v1
。输入不为空,转换为int并推送到当前向量。