web-dev-qa-db-ja.com

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

C++でcinバッファーをクリアするにはどうすればよいですか?

103
Tal

おそらく:

std::cin.ignore(INT_MAX);

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

また:おそらく、この前にstd::cin.clear();を実行して、ストリームの状態をリセットすることもできます。

94
Evan Teran

私は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')
107
Martin York
cin.clear();
fflush(stdin);

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

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

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

これには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
Ben
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";
7
user187046

どうですか:

cin.ignore(cin.rdbuf()->in_avail());
3
asdf

別の可能な(手動)解決策は

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

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

3
Bobul Mentol

私が好む:

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 を参照してください。

3
Shadow2531

最も簡単な方法:

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

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

#include <stdio_ext.h>

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

__fpurge(stdin)
1
techcomp

以下が動作するはずです:

cin.flush();

一部のシステムでは使用できないため、次を使用できます。

cin.ignore(INT_MAX);
1
Gunnar Steinn

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

0
GuestPerson001