代码之家  ›  专栏  ›  技术社区  ›  Armin Ronacher

忽略STD的EOF:C++中的CIN

  •  2
  • Armin Ronacher  · 技术社区  · 17 年前

    ^D EOF已发布,我的 getline() 调用返回一个空字符串,我将其视为“无输入”,并再次显示提示。

    这将导致打印提示的无休止循环。

    EOFError 但是在C++中没有例外,我可以捕捉到,而且似乎没有设置。 cin 忽略EOF。

    有什么提示吗?

    5 回复  |  直到 17 年前
        1
  •  7
  •   Johannes Schaub - litb    17 年前

    如果它什么都看不懂,它就会设置 failbit . 只需在if条件下测试流,并清除位:

    if(!getline(std::cin, myline)) {
        std::cin.clear();
        std::cout << "you should enter something" << std::endl;
    }
    

    在内部,在您的案例中,顺序是这样的:

    • 在终端上等待字符串。终端将阻塞,直到用户发出换行符。可能出现两种可能的错误情况
      1. 用户立即按EOF。这将使 getline 完全不读任何东西,它将设置 故障位 eofbit .
      2. 用户输入一些内容,然后按EOF。这将使 getline 消耗一些东西,然后它在尝试获取下一个角色时点击EOF。这个原因
    • 你将尝试再次阅读一些内容。提取函数将创建类型为的对象 istream::sentry 它检查流处于什么状态。如果设置了任何错误位,将导致提取功能立即返回。这导致了以前的无休止循环。

    clear() 清除所有错误位,您可以再次继续阅读您的资料。

        2
  •  3
  •   Armin Ronacher    17 年前

    由于litb,解决方案正确:

    if (!getline(std::cin, str)) {
        std::cin.clear();
        std::cout << std::endl;
    }
    
        3
  •  1
  •   dirkgently    17 年前

    getline() 通过使用以下位,功能发出错误信号:

    • eofbit
    • 坏蛋

    在继续之前,请尝试检查这些。

        4
  •  0
  •   amit kumar    17 年前

    看见 http://www.horstmann.com/cpp/pitfalls.html

    while (cin)
    {  int x;
       cin >> x;
       if (cin) a.push_back(x);
    }
    
        5
  •  0
  •   ypnos    17 年前

    好的,在其他回答中,使用cin.clear()被描述为一种可能的解决方案。

    有些库可能会尝试收集更多信息(甚至节省编码时间):

    here .