4

私はいくつかのcin操作を行いましたが、使用する前にcin、その状態をクリアしてフラッシュしたいと考えています。どうすればいいのですか?cin.clear()エラー状態をクリアすることはわかっていますが、バッファをフラッシュするには、cin バッファが空かどうかを確認するにはどうすればよいですか?そうでない場合は、後で安全に使用できるように、次のどのステートメントを使用して空にする必要がありcinますか?

cin.ignore(std::numeric_limits<std::streamsize>::max()); 

また

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
4

3 に答える 3

6

問題を検出したようで、誤った入力 (入力された行など) を取り除きたいと考えています。バッファにあるものを取り除こうとすることもできstd::cinますが、ストリームが完全な行などを読み取ったという保証がないため、通常、これはあまりうまく機能しません。また、潜在的に役立つようにするには、同期されていないことstdinを確認する必要があります。std::cinstd::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、カウントが終了基準と見なされるべきではないことを示す魔法の数として使用されます。終了文字を渡さない場合、ストリームはストリームの最後まで文字を無視しますが、これはおそらくあなたが望むものではありません。

于 2013-10-19T19:09:32.393 に答える
1

ストリーム バッファにはin_availメソッドがあります。ただし、関係なくコンテンツを単純に削除してみてください。

template <class charT, class traits>
std::basic_istream<charT, traits>&
empty_buffer(std::basic_istream<charT, traits>& is)
{
    std::basic_streambuf<charT, traits>* p = is.rdbuf();
    p->pubseekpos(0, std::ios_base::in);

    return is.ignore(std::numeric_limits<std::streamsize>::max());
}
于 2013-10-19T19:10:09.960 に答える