我有一个实现交互式 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;
}
在内部,您的情况的顺序是这样的:
- Wait on the terminal for a string. Terminal will block until the user emits a newline. Two probable error cases possible
- 用户立即按下 EOF。这将使
getline
什么都不读,它会设置failbit
和eofbit
.
- 用户输入一些内容,然后按 EOF。这将使
getline
消耗一些东西,然后在尝试获取下一个字符时遇到 EOF。这个原因eofbit
要设置。
- 你会尝试再次阅读一些东西。提取函数将创建一个类型的对象
istream::sentry
它检查流的状态。如果设置了任何错误位,都会导致提取函数立即返回。这导致了之前的无限循环。
致电clear()
清除所有错误位,您可以继续再次阅读您的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)