cinバッファーをフラッシュするにはどうすればよいですか?


回答:


101

おそらく:

std::cin.ignore(INT_MAX);

これにより、まで読み込まれ、無視されますEOF。(2番目の引数を指定して、それまでに読み取る文字を指定することもできます(例:'\n'1行を無視する)。

また、次のことも実行する必要があります。std::cin.clear();これの前にも、ストリームの状態をリセットします。


10
(以前は知っていました。)むしろ、前にクリアして、ストリームをバッファーで操作できる良好な状態にします。
GManNickG

ありがとう、GMan!それはまず間違った方法でしたか、そして私の間違いを探すのにかなりの時間を費やしました。
balu

@GManNickG、ちょうど答えを修正しました。
bwDraco

@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
ajay

@ajay:いいえ。それはあなたが決める必要があるものです。上記の内容を説明するだけです。
マーティンヨーク

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

これは、コンソールから読むときに私にとってうまくいった唯一のものでした。それ以外の場合は、\ nがないために無期限に読み取られるか、バッファに何かが残ります。

編集:私は以前の解決策が事態を悪化させていることを知りました。しかし、これは機能します:

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

13

これに対する2つの解決策を見つけました。

最初の、そして最も簡単なのは、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)は、C標準の拡張機能として、 Windows(少なくともGCCコンパイラとMSコンパイラ)で期待どおりに機能するようです。

そのため、それを使用すると、コードは移植できなくなります。

fflush(stdin)の使用を参照してください。

また、別の方法については、http://ubuntuforums.org/showpost.php?s = 9129c7bd6e5c8fd67eb332126b59b54c&p = 452568&postcount = 1を参照してください。


9
fflush(stdin); 未定義の動作(Cプログラミング言語)であり、7.18.5.2
2

1
有効な有効なクラッジを提供するための+1。仕事がある人もいれば、基準がある人もいます。
ミハイル

5
@Mikhail:あなたの仕事は標準に準拠したコードを書くことを含むべきです。今後あなたが書いたものは絶対に使わないようにします。
Ed S.

4

別の可能な(手動)ソリューションは

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

CLionでfflushまたはcin.flush()を使用できないので、これは便利です。


私にとって無限ループ。
StarWind0 2016

行の終わりがある場合にのみ機能します。それ以外の場合は無限ループになります
Bobul Mentol

2

最も簡単な方法:

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

stdinストリームの末尾にcinポインターを配置するだけで、cin.clear()はEOFフラグなどのすべてのエラーフラグをクリアします。


1

以下はうまくいくはずです:

cin.flush();

一部のシステムでは使用できず、使用できます。

cin.ignore(INT_MAX);

1
EOF(2番目のパラメーターのデフォルト値)に達するまで、読み取りINT_MAX文字を無視するように指示できるのに、手動でループを作成する理由
エヴァンテラン

ガンナー、念のため、これを反映するように投稿を編集した方がいいかもしれません。
Dana the Sane

1
私の知る限り、このflushメソッドは出力専用であり、すでに書き込まれた文字を扱います。
マークファンレーウェン

cin.flush(): basic_istream<char>' has no member named 'flush'
エリック

1
#include <stdio_ext.h>

そして、関数を使用します

__fpurge(stdin)

0

cin.get() 奇妙なことに自動的にそれをフラッシュするようです(これは混乱しやすく、おそらく気質があるため、おそらく推奨されません)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.