首页 文章

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

提问于
浏览
0

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

  • 1

    当你执行 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

    在使用EOF(即CTRL-D或CTRL-Z)结束后,您需要调用cin.clear();,以便再次重复使用它 .

  • 2

    此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并推送到当前向量 .

相关问题