問題を検出したようで、誤った入力 (入力された行など) を取り除きたいと考えています。バッファにあるものを取り除こうとすることもできstd::cin
ますが、ストリームが完全な行などを読み取ったという保証がないため、通常、これはあまりうまく機能しません。また、潜在的に役立つようにするには、同期されていないことstdin
を確認する必要があります。std::cin
std::cin
std::ios_base::sync_with_stdio(false);
// read data using std::cin
if (!std::cin) {
// clean-up
std::cin.clear();
if (std::cin) {
std::cin.ignore(std::cin.rdbuf()->in_avail()); // ignore what is buffered
}
}
ゼロ以外の値を返すかどうかin_avail()
は、使用されるストリーム バッファに完全に依存し、実際に無視したい以上のものを無視する場合があります。たとえば、std::cin
のストリーム バッファが のストリーム バッファを使用するように置き換えられた場合、std::istringstream
おそらくこのソースのすべての文字が消費されます。
おそらく最も賢明なクリーンアップはignore()
、次の文字または現在の行の文字に対して、次のいずれかを使用することです。
std::cin.ignore();
また
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
のmax()
はstd::streamsize
、カウントが終了基準と見なされるべきではないことを示す魔法の数として使用されます。終了文字を渡さない場合、ストリームはストリームの最後まで文字を無視しますが、これはおそらくあなたが望むものではありません。