【发布时间】:2010-09-20 09:39:32
【问题描述】:
如何在 C++ 中清除 cin 缓冲区?
【问题讨论】:
标签: c++ cin io-buffering
如何在 C++ 中清除 cin 缓冲区?
【问题讨论】:
标签: c++ cin io-buffering
与 C 版本相比,我更喜欢 C++ 大小限制:
// Ignore to the end of file
std::cin.ignore(std::numeric_limits<std::streamsize>::max())
// Ignore to the end of line
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
【讨论】:
cin 并使用上面的第一条语句刷新cin 缓冲区,那么它会一直提示输入直到我按ctrl+d输入EOF?
可能:
std::cin.ignore(INT_MAX);
这将读入并忽略所有内容,直到EOF。 (您还可以提供第二个参数,它是要读取的字符(例如:'\n' 忽略一行)。
另外:您可能还想在此之前执行:std::cin.clear(); 以重置流状态。
【讨论】:
EOF(因为INT_MAX 很大)。如帖子中所述,如果您只想忽略一行,则需要指定一个额外的参数'\n 来告诉它您只想忽略到该行的末尾。
cin.clear();
fflush(stdin);
这是从控制台读取时唯一对我有用的东西。在其他所有情况下,它要么会因为缺少 \n 而无限期地读取,要么会保留在缓冲区中。
编辑: 我发现以前的解决方案使事情变得更糟。然而,这个有效:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
【讨论】:
我找到了两种解决方案。
第一个也是最简单的,例如使用std::getline():
std::getline(std::cin, yourString);
...当输入流到达换行符时将丢弃它。阅读有关此功能的更多信息here。
另一个直接丢弃流的选项是这个...
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
祝你好运!
【讨论】:
int i;
cout << "Please enter an integer value: ";
// cin >> i; leaves '\n' among possible other junk in the buffer.
// '\n' also happens to be the default delim character for getline() below.
cin >> i;
if (cin.fail())
{
cout << "\ncin failed - substituting: i=1;\n\n";
i = 1;
}
cin.clear(); cin.ignore(INT_MAX,'\n');
cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";
string myString;
cout << "What's your full name? (spaces inclded) \n";
getline (cin, myString);
cout << "\nHello '" << myString << "'.\n\n\n";
【讨论】:
怎么样:
cin.ignore(cin.rdbuf()->in_avail());
【讨论】:
我更喜欢:
cin.clear();
fflush(stdin);
有一个例子 cin.ignore 只是没有削减它,但我现在想不起来。不久前我需要使用它(与 Mingw 一起)。
但是,根据标准,fflush(stdin) 是未定义的行为。 fflush() 仅用于输出流。 fflush(stdin) 似乎只能在 Windows 上按预期工作(至少使用 GCC 和 MS 编译器)as an extension to the C standard。
因此,如果您使用它,您的代码将无法移植。
另外,请参阅http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 了解替代方案。
【讨论】:
另一种可能的(手动)解决方案是
cin.clear();
while (cin.get() != '\n')
{
continue;
}
我不能将 fflush 或 cin.flush() 与 CLion 一起使用,所以这很方便。
【讨论】:
最简单的方法:
cin.seekg(0,ios::end);
cin.clear();
它只是将 cin 指针定位在标准输入流的末尾,而 cin.clear() 清除所有错误标志,例如 EOF 标志。
【讨论】:
它对我有用。我已经使用 getline() 的 for 循环。
cin.ignore()
【讨论】:
以下应该有效:
cin.flush();
在某些系统上它不可用,然后您可以使用:
cin.ignore(INT_MAX);
【讨论】:
flush 方法仅用于输出,处理已写入的字符。
basic_istream<char>' has no member named 'flush'
#include <stdio_ext.h>
然后使用函数
__fpurge(stdin)
【讨论】:
cin.get() 似乎很奇怪地自动刷新它(但可能不是首选,因为这令人困惑并且可能是喜怒无常的)。
【讨论】: