std::cin のバッファをクリアする

std::cin を使っていると、前に使っていた最後の改行コードが残ってしまっていて意図しない動作をする場合がある。さて、となると std::cin のバッファをクリアしたくなるのだけれども、やり方がわからない。調べてみた。

std::cin.ignore()

というメソッドがあった。で、カッコの中にはクリアするバイト数を記載する。無指定だと値は1。つまり全部をクリアするという方法はそのままではなさそう。

では次に、std::cin のバッファ中にどれだけたまっているかを確認する方法があればよい。で、その方法がこれ。

cin.rdbuf()->in_avail()

この関数は streamsize 型の値を返す。
しかしながらバッファに '\n' を含む場合にうまくいかない。
いろいろと調べたところ、下記のように指定することで意図通りの動作になった。

cin.ignore( cin.rdbuf()->in_avail() );   // この方法では '\n' が消えないので修正。2017/8/16 更新

cin.ignore((std::numeric_limits<std::streamsize>::max)(), '\n');  // 「#include <limits>」が必要です。 2017/8/16 更新

まぁ確かにこれでできるのはわかるが、私としちゃもっとシンプルに

cin.ignore_all();

というように使いたい。そんな風に思うのは私だけだろうか?
休日にパソコンで遊んでいる際の、ふと思ったことでした。

 

記載

2017-08-16 - 更新
2012-09-14 - 新規作成