我有一个实现交互式shell的应用程序,类似于Python控制台/ irb的工作方式.现在的问题是,如果用户意外命中^D
EOF,我的getline()
调用将返回一个空字符串,我将其视为"无输入"并再次显示提示.
然后,这将导致无限循环打印提示.
现在在Python中我会通过捕获来解决这个问题EOFError
,但是在C++中没有引发异常,我可以捕获并且似乎没有设置cin
忽略EOF.
任何提示?
如果它无法读取任何内容,它会设置failbit
.只需在if条件下测试流,然后清除该位:
if(!getline(std::cin, myline)) {
std::cin.clear();
std::cout << "you should enter something" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在内部,序列就是这种方式:
getline
内容都没有读取,它将设置failbit
和eofbit
.getline
消耗一些东西,然后在尝试获取下一个角色时它会击中EOF.这个原因eofbit
要设定.istream::sentry
检查流的状态.如果设置了任何错误位,将导致提取功能立即返回.这导致了无休止的循环.一个clear()
清除所有错误位的调用,你可以继续阅读你的东西.