1

入れたときにプログラムが問題なく動作するのはなぜcin.clear()ですかcin.ignore()。たとえば、入れてcharsもプログラムにバグはありません。

しかし、cin.ignore()最初に thenを入力cin.clear()すると、プログラムはエラー信号の送信を停止しません。

これはどのように作動しますか?

入力を消去してfail flag設定を解除すべきではありませんか?

#include <iostream>

using namespace std;

class time
{
private:
int hours;


public:
void getime()
{
do
   {
   cout << "Enter hours: ";
   cin >> hours;
   if ( hours < 0 || hours > 23 || cin.fail()  )
   {
       cin.clear();
       cin.ignore(10,'\n');
       cerr << "invalid time, minutes must be between 0 and 59 " << endl;


   }
   }while(hours<0 || hours>23);
}
   };

int main()
{
    time asd;
    asd.getime();
    return 0;
}
4

1 に答える 1

6

cin.clear(); cin.ignore(10,'\n');ストリームのエラー フラグをクリアして再度読み取り可能にし、最大 10 文字を行末までスキップしようとします。

cin.ignore(10,'\n'); cin.clear();最初に最大 10 文字を行末までスキップしようとします (ストリームがエラー状態の場合は失敗し、何もしません)。次に、ストリームのエラー フラグをクリアして、再度読み取り可能にします。次に、ループを回って、前回の失敗の原因となった不適切な形式のデータの読み取りを再試行します。

質問が「エラー状態にあるストリームからデータを破棄するために使用できないのはなぜignoreですか」という場合は、ええと、できません。ストリームが使用されるように設計されている方法は、ストリームがエラー状態になり、それを修正する方法を知るまで (そしてエラーを無視していると言うまで) 何もせずにそこに座っているか、clear()またはあきらめて終了することです。

于 2012-10-15T16:15:23.657 に答える