48057
正常状態と読み取り失敗の違いと二つの使い分けが知りたいです。

```

            #include <string>
            #include <cctype>
            #include <iostream>
                #include <fstream>
            #include <iomanip>
            #include <vector>
            using namespace std;
    
            #define BUFFER 2
            int main()
            {
                string number;
                char str[32];
                while (true) {
                    cout << "文字を入力してください:";
                    //cin >>setw(3)>> number;
                    cin.getline(str,BUFFER);
    
                    /*入力エラー処理*/
                    if (cin.good() != true) {//正常じゃない時
                        cout << "入力エラー\n";
                        cin.clear();
                        cin.ignore(1024,'\n');
                        continue;
                    }
    
                    cout << "number:" << str << endl;
                    cin.ignore(1024,'\n');
    
    
                }
    
                //good正常状態エラーなし
                //fail読み取り失敗
    
                _getch();
                return 0;
            }
    
```
CC BY-SA 4.0
2018-09-03T11:18:31.987
48054
2018-09-05T00:54:42.807
question
c++
c++,cin.fail()とcin.good()の違いが知りたい
ストリーム状態は下記(およびそのリンク先)を参照すると良いと思います。

> <https://ja.cppreference.com/w/cpp/io/basic_ios>

正常以外の状態は、

  * `eof` : ファイル終端に達した
  * `fail` : エラーが発生した
  * `bad` : 回復不可能なエラーが発生した

となっています。`!cin.good()`だと、上記のどれが発生したかわからないので、処理を誤る可能性があると思います。

＃少なくとも`eof`は明示的に(`cin.eof()`で)判定した方が良いと思います。
CC BY-SA 4.0
2018-09-03T12:55:19.933
48057
2018-09-03T12:55:19.933
20098
48054
answer
`エラー内容の説明は既にあるので別の方面から解説。

  * `eof()` は `eofbit`
  * `fail()` は `failbit`
  * `bad()` は `badbit`

のそれぞれ別のエラーフラグを `read-only` 検査するための `const`
メンバ関数です。なお複数のエラーフラグが同時に立つことが普通にあります。

  * `good()` はエラーフラグが１つも立っていないとき真です。

具体例を挙げるテスト

```

    int i;
    cin >> i;
    
```

に対して

  * 123 を与えると成功し `good` (`fail` や `eof` や `bad` にならない)
  * abc を与えると変換不能なだけなので `fail` (`eof` や `bad` にはならない)
  * `EOF` を与えると変換不能かつ eof なので `fail` かつ `eof` (`bad` にならない)
  * 123`EOF` を与えると読み取って変換できた結果 eof なので `eof` (`fail` や `bad` にならない)

`bad` が発生するとしたら I/O エラーやプログラム自体のバグなのでネット掲示板で簡単に再現することは困難です。

* * *

どれを使うと正しいかは要求っつか案件次第。オイラが過去に書いたコードでは `fail()` を使っていることが多いようでした。 `fail`
ったときの入力はそのままバッファに残るので読み飛ばす処理を入れないと無限ループにはまりますから、その辺は要注意。

* * *

それと [c](/questions/tagged/c "'c' のタグが付いた質問を表示") の `stdin` も
[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") の `std::cin`
も、一度読み込み操作をしないと `EOF` を検出しない仕様なので

```

    while (!cin.eof()) { ... }
    
```

は（読む前に `EOF` 判定をしているので）期待通りの動作にならないことには注意。
CC BY-SA 4.0
2018-09-05T00:54:42.807
48090
2018-09-05T00:54:42.807
8589
48054
answer