可能有多个 while (cin>>input)

Possible to have multiple while (cin>>input)

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

您需要在以 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并push到当前向量。

当您执行 while (cin>>input) 时,您实际上是在要求输入流 cin 生成整数,直到流变坏(即遇到 EOF,steam 无法转换用户的输入到一个整数,或者可能还有另一个问题)。

循环终止后,流的状态仍将处于导致它停止循环的任何状态。为了继续从 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);