1

parashiftのC++ FAQ では、次のようなものを使用しています。

while (cout << "Enter an integer: " && !(cin >> foo))
{
    cin.clear();

    //feel free to replace this with just (80, '\n') for my point
    cin.ignore (numeric_limits<streamsize>::max(), '\n');
}

cin.ignore (...)ただし、は不要のようです。なぜ使えないのcin.sync()ですか?それはより短く、長さを必要としません。そもそも入力バッファに文字があるかどうかに関係なく同じように機能するため、より用途が広いです。使用したのと同じループでこれを1回テストしましたがignore、同じように機能しました。しかし、このタイプの入力検証を含むすべての例では、ignoreの代わりに を使用しているようですsync

ignoreはるかに単純な代替手段がある場合、使用の背後にある理由は何ですか?

重要な場合:
Windows
GCC
MinGW

4

2 に答える 2

3

ifstream では、の効果sync()は実装で定義されています (C++11、§27.9.1.5/19 による) -- 希望どおりに動作するという保証はありません (また、実際に動作するという保証はまったくありません)。 )。典型的なケースでは、ストリームがライン バッファリングされている場合とほぼ同等ignoreですが、ストリームがバッファリングされていない場合はおそらく何も実行されず、ストリームが完全にバッファリングされている場合はおそらく悪いことをする。

于 2012-04-11T00:19:12.913 に答える
1

どちらも違うことをしています。syncすでに先読みされた文字は、その数や種類に関係なく破棄されます。一方、ignore特定の文字が検出されるまで、それらの文字が既に読み取られているかどうか、または既に読み取られている文字が他にあるかどうかに関係なく、文字を破棄します。たとえばcin、40 バイトのバッファーがあるとしますが、行には 80 バイトがありました。次に、最初の 40 バイトがcinのバッファに読み取られた可能性があります。それらの先頭を解釈した後、呼び出して、既に読んだ 40 文字syncの残りを破棄しますが、そうではありません行の残りの 40 文字。一方、入力は、通常行バッファリングが行われないパイプから来る場合があります。その場合、現在の行だけでなく、先読みされた次の行の一部も破棄できます。OTOH は、ignore常に次の文字まで読むことを常に確実に知っています\n(無視する文字の最大数がそれに遭遇するのに十分な数であると仮定します)。

于 2012-04-11T00:13:00.390 に答える