看来,您检测到了一个问题,并且您想删除错误的输入,例如输入的行。您可以尝试删除std::cin
其缓冲区中的内容,但通常,这并不能很好地工作,因为不能保证流已读取,例如完整的行。stdin
此外,为了使其可能有用,您需要确保它std::cin
不同步,否则std::cin
将永远不会缓冲任何字符:
std::ios_base::sync_with_stdio(false);
// read data using std::cin
if (!std::cin) {
// clean-up
std::cin.clear();
if (std::cin) {
std::cin.ignore(std::cin.rdbuf()->in_avail()); // ignore what is buffered
}
}
是否in_avail()
会返回非零值完全取决于使用的流缓冲区,并且它可能忽略的内容比您实际想要忽略的要多。例如,如果将std::cin
的流缓冲区替换为使用 的流缓冲区,std::istringstream
它可能会消耗来自该源的所有字符。
可能最明智的清理是ignore()
使用下一个字符或当前行上的字符
std::cin.ignore();
或者
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
max()
of用作一个神奇的std::streamsize
数字,表示不应将计数视为终止标准。如果您不传递终止字符,则流将忽略字符,直到流结束,这可能不是您想要的。