在C++中忽略std :: cin上的EOF

Arm*_*her 2 c++ console stdin

我有一个实现交互式shell的应用程序,类似于Python控制台/ irb的工作方式.现在的问题是,如果用户意外命中^DEOF,我的getline()调用将返回一个空字符串,我将其视为"无输入"并再次显示提示.

然后,这将导致无限循环打印提示.

现在在Python中我会通过捕获来解决这个问题EOFError,但是在C++中没有引发异常,我可以捕获并且似乎没有设置cin忽略EOF.

任何提示?

Joh*_*itb 7

如果它无法读取任何内容,它会设置failbit.只需在if条件下测试流,然后清除该位:

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

在内部,序列就是这种方式:

  • 在终端上等待一个字符串.终端将阻止,直到用户发出换行符.可能出现两个可能的错误情况
    1. 用户立即按下EOF.这将使任何getline内容都没有读取,它将设置failbiteofbit.
    2. 用户输入内容然后按EOF.这将getline消耗一些东西,然后在尝试获取下一个角色时它会击中EOF.这个原因eofbit要设定.
  • 你会尝试再读一些东西.提取函数将创建一个类型的对象,该对象istream::sentry检查流的状态.如果设置了任何错误位,将导致提取功能立即返回.这导致了无休止的循环.

一个clear()清除所有错误位的调用,你可以继续阅读你的东西.