我有一个实现交互式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; }
在内部,序列就是这种方式:
在终端上等待一个字符串.终端将阻止,直到用户发出换行符.可能出现两个可能的错误情况
用户立即按下EOF.这将使任何getline
内容都没有读取,它将设置failbit
和eofbit
.
用户输入内容然后按EOF.这将getline
消耗一些东西,然后在尝试获取下一个角色时它会击中EOF.这个原因eofbit
要设定.
你会尝试再读一些东西.提取函数将创建一个类型的对象,该对象istream::sentry
检查流的状态.如果设置了任何错误位,将导致提取功能立即返回.这导致了无休止的循环.
一个clear()
清除所有错误位的调用,你可以继续阅读你的东西.