web-dev-qa-db-ja.com

cin.fail()を使用する正しい方法

cin.fail();を使用する正しい方法は何ですか?

あなたが何かを入力する必要があるプログラムを作っています。数字や文字を入力する必要があるかどうかはあまり明確ではありません。ユーザーが数字ではなく文字を入力すると、コンソールがおかしくなります。 cin.fail()を使用してこれを修正するにはどうすればよいですか?

または、より良い方法はありますか?

16
user2630617

cin.fail()は、最後のcinコマンドが失敗した場合はtrueを返し、そうでない場合はfalseを返します。

例:

_int main() {
  int i, j = 0;

  while (1) {
    i++;
    cin >> j;
    if (cin.fail()) return 0;
    cout << "Integer " << i << ": " << j << endl;  
  }
}
_

ここで、テキストファイル-input.txtがあり、その内容が次のとおりであるとします。

_  30 40 50 60 70 -100 Fred 99 88 77 66
_

その上で上記の短いプログラムを実行すると、次のようになります。

_  Integer 1: 30
  Integer 2: 40
  Integer 3: 50
  Integer 4: 60
  Integer 5: 70
  Integer 6: -100
_

7番目のWordを読み込んだ後に終了するため、6番目の値以降は継続しません。これは整数ではないためです。cin.fail()trueを返します。

8
Shumail

std::cin.fail()は、前の入力が成功したかどうかをテストするために使用されます。ただし、ストリームをブール値であるかのように使用する方が慣用的です。

if ( std::cin ) {
    //  last input succeeded, i.e. !std::cin.fail()
}

if ( !std::cin ) {
    //  last input failed, i.e. std::cin.fail()
}

入力の構文が複数の文字のいずれかを許可するコンテキストでは、通常の解決策は、行ごとに(または他の文字列形式で)読み取り、解析することです。数字があることを検出したら、std::istringstreamまたはそれを変換するためのその他の選択肢(strtol、またはstd::stoi C++ 11がある場合)。

ただし、ストリームから直接データを抽出することは可能です。

bool isNumeric;
std::string stringValue;
double numericValue;
if ( std::cin >> numericValue ) {
    isNumeric = true;
} else {
    isNumeric = false;
    std::cin.clear();
    if ( !(std::cin >> stringValue) ) {
        //  Shouldn't get here.
    }
}
17
James Kanze