可能有多个while(cin>>输入)

时间:2016-09-16 14:50:44

标签: c++ vector while-loop cin

我想知道是否可以有多个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)?

3 个答案:

答案 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并推送到当前向量。