如何冲洗cin缓冲液?


Answers:


101

可能:

std::cin.ignore(INT_MAX);

它将读入并忽略所有内容,直到EOF。(您还可以提供第二个参数,该参数是要读取直到(例如:'\n'忽略一行)的字符。

另外:您可能还想做一个:std::cin.clear();在此之前重设流状态。


10
(我知道这很旧。)而是先清除,然后将流置于可以在其缓冲区上进行操作的良好状态。
GManNickG

谢谢,GMan!首先,它是用错误的方式进行的,并且花了很多时间寻找我的错误。
balu

@GManNickG,只需修复答案即可。
2012年

@DragonLord:显而易见的解决方案,我应该事后考虑,谢谢。:)
GManNickG 2012年

3
只是想指出,对于我的情况,我认为必须使用“ \ n”。否则,后续的“ cin >>”将不起作用。
Cardin

114

与C版本相比,我更喜欢C ++大小限制:

// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())

// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

15
更重要的是,值可能不同!(streamsize不必一定是int)

2
您能否举一个我们需要忽略到文件末尾的示例,因为如果我使用cin并使用上面的第一个语句来刷新cin缓冲区,那么它会一直提示输入,直到我EOF按进入ctrl+d
2013年

@ajay:不。那是您需要决定的事情。我只是在解释以上内容。
马丁·约克

23
cin.clear();
fflush(stdin);

从控制台读取时,这是唯一对我有用的东西。在其他所有情况下,由于缺少\ n,它将无限期读取,或者某些内容将保留在缓冲区中。

编辑:我发现以前的解决方案使情况变得更糟。但是,此方法有效:

cin.getline(temp, STRLEN);
if (cin.fail()) {
    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
}

13

我已经找到了两种解决方案。

第一种,也是最简单的,std::getline()例如使用:

std::getline(std::cin, yourString);

...将在换行时丢弃输入流。在此处阅读有关此功能的更多信息。

直接丢弃流的另一个选择是...

#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');

祝好运!


9
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";


4

我更喜欢:

cin.clear();
fflush(stdin);

有一个例子,其中cin.ignore只是不删减它,但目前我还无法想到。前一段时间我需要使用它(与Mingw一起使用)。

但是,根据标准,fflush(stdin)是未定义的行为。fflush()仅用于输出流。fflush(stdin)似乎只能在Windows(至少具有GCC和MS编译器)上作为C标准的扩展来正常工作

因此,如果使用它,您的代码将无法移植。

请参阅使用fflush(stdin)

另外,请参见http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1


9
fflush(stdin); 未定义行为(在C编程语言),明确规定7.18.5.2/2如此
Cubbi

1
+1可提供有效的工作状态。有些人有工作,其他人有标准。
米哈伊尔(Mikhail)2012年

5
@Mikhail:您的工作应包括编写符合标准的代码。我将确保避免使用您以后编写的任何内容。
Ed S.

4

另一个可能的(手动)解决方案是

cin.clear();
while (cin.get() != '\n') 
{
    continue;
}

我不能将fflush或cin.flush()与CLion一起使用,所以这很方便。


对我来说无限循环。
StarWind0 '16

它只有在行尾才有效,否则会无限循环
Both Mentol

2

最简单的方法:

cin.seekg(0,ios::end);
cin.clear();

它只是将cin指针放在stdin流的末尾,并且cin.clear()清除所有错误标志,例如EOF标志。


1

以下应该工作:

cin.flush();

在某些系统上,它不可用,然后可以使用:

cin.ignore(INT_MAX);

1
为什么可以手动编写一个循环,当您可以告诉忽略读取的INT_MAX字符,直到达到EOF(第二个参数的默认值)时。
埃文·特兰

Gunnar,以防万一,最好编辑您的帖子以反映这一点。
Dana the Sane

1
据我所知,该flush方法仅用于输出,并且处理已经写入的字符。
Marc van Leeuwen 2015年

cin.flush():basic_istream<char>' has no member named 'flush'
eric

1
#include <stdio_ext.h>

然后使用功能

__fpurge(stdin)

0

cin.get() 似乎自动将其刷新得很奇怪(不过可能不是首选,因为这很容易混淆,而且可能很气质)。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.