可以有多个同时(cin>>输入)

Possible to have multiple while (cin>>input)

本文关键字:gt cin 输入      更新时间:2023-10-16

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

当你做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);

您需要在以EOF结束后调用cin.clear();(即CTRL-DCTRL-Z),以再次重用它。

这个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并压入当前向量