【问题标题】:Possible to have multiple while (cin>>input)可能有多个 while (cin>>input)
【发布时间】:2017-01-24 20:31:18
【问题描述】:

我想知道是否可以有多个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 结尾)后,我无法为第二个向量输入第二组数字,程序立即终止。我怀疑用于第一个向量的第一个 cin 的 EOF 也由第二个向量的第二个 cin 处理。

上面的程序有什么方法可以正确运行,即有多个 while (cin)?

【问题讨论】:

  • 您尝试过使用调试器吗?
  • @AlgirdasPreidžius 调试器能在多大程度上提供帮助?
  • @πάνταῥεῖ 好吧,它至少会摆脱诸如我怀疑...这样的陈述。

标签: c++ vector while-loop cin


【解决方案1】:

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

【讨论】:

  • 如果标准输入是从文件重定向或连接到管道,这将不起作用。
  • @MartinNyolt 我没有看到问题中提到的任何内容。
  • 哦,这不是冒犯的意思。正如一个警告,这个解决方案并不普遍适用。相反,他没有说他假设他的程序直接连接到终端。只是用户以某种方式定义值。
【解决方案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并push到当前向量。

【讨论】:

    【解决方案3】:

    当您执行 while (cin&gt;&gt;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);
    

    【讨论】:

      猜你喜欢
      • 2013-10-16
      • 1970-01-01
      • 2013-10-29
      • 2014-01-19
      • 2019-02-12
      • 2017-06-21
      • 2015-11-05
      • 1970-01-01
      相关资源
      最近更新 更多