我做了一些cin操作,在使用之前我cin想清除它的状态并冲洗它.我该怎么做?我知道cin.clear()清除错误状态但是要刷新cin
缓冲区如何检查它是否为空,如果不是,我将使用哪个以下语句清空它以便以后可以安全使用cin?
cin.ignore(std::numeric_limits<std::streamsize>::max());
Run Code Online (Sandbox Code Playgroud)
要么
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Run Code Online (Sandbox Code Playgroud)
看来,你发现了一个问题并想要摆脱错误的输入,例如输入的行.您可以尝试去掉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
}
}
Run Code Online (Sandbox Code Playgroud)
是否in_avail()返回非零值完全取决于使用的流缓冲区,并且它可能忽略了比您实际想要忽略的更多.例如,如果std::cin替换了流缓冲区以使用它的流缓冲区,std::istringstream它可能会消耗此源中的所有字符.
可能最明智的清理是ignore()下一个字符或当前行上的字符,使用其中任何一个
std::cin.ignore();
Run Code Online (Sandbox Code Playgroud)
要么
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Run Code Online (Sandbox Code Playgroud)
该max()中std::streamsize被用作一个神奇的数字来表示的计数不应该被视为一个终止条件.如果您没有传递终止字符,则流将忽略字符,直到流的末尾可能不是您想要的.