C++ で cin.fail メソッドを使用する

胡金庫 2023年10月12日
  1. C++ でストリームオブジェクトにエラーが発生したかどうかを調べるには fail メソッドを使用する
  2. C++ でストリームオブジェクトにエラーが発生したかどうかを調べるには good メソッドを用いる
  3. C++ でストリームオブジェクトを式にしてエラーが発生したかどうかを調べる
C++ で cin.fail メソッドを使用する

この記事では、C++ でストリームオブジェクト上で fail メソッドを正しく使用する複数の方法を示します。

C++ でストリームオブジェクトにエラーが発生したかどうかを調べるには fail メソッドを使用する

fail メソッドは basic_ios クラスの組み込み関数であり、指定したストリームの状態に誤りがあったかどうかを検証するために呼び出すことができます。この関数は引数を取らず、ストリームオブジェクトにエラーが発生した場合はブール値 true を返します。ストリームオブジェクトには、現在の状態を記述するための定数ビットがいくつかあることに注意してください。これらの定数は - goodbiteofbitfailbitbadbit です。failbit がセットされている場合は、操作に失敗したことを意味するが、ストリーム自体は良好な状態であることを示しています。badbit はストリームが破損した場合に設定されています。fail メソッドは、指定したストリームオブジェクトに badbit または failbit が設定されている場合に true を返します。

#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::ifstream;
using std::ostringstream;
using std::string;

int main() {
  string filename("tmp.txt");
  string file_contents;

  auto ss = ostringstream{};
  ifstream input_file(filename);
  if (input_file.fail()) {
    cerr << "Could not open the file - '" << filename << "'" << endl;
    exit(EXIT_FAILURE);
  }

  ss << input_file.rdbuf();
  file_contents = ss.str();

  cout << file_contents;
  exit(EXIT_SUCCESS);
}

C++ でストリームオブジェクトにエラーが発生したかどうかを調べるには good メソッドを用いる

あるいは、組み込み関数 good を呼び出してストリームオブジェクトが良好な状態にあるかどうかを調べることもできます。ストリームの状態で goodbit 定数が設定されているということは、他のすべてのビットがクリアされていることを意味するので、これをチェックすることはストリームの状態が良好であることを意味します。これらの定数はクラス ios_base の中で定義されており、std::ios_base::goodbit と呼ばれることに注意してください。以下のコード例では、good メソッドの戻り値の論理否定を指定することで、ストリーム上で障害が発生していないかどうかをチェックする条件として指定できることを示しています。

#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::ifstream;
using std::ostringstream;
using std::string;

int main() {
  string filename("tmp.txt");
  string file_contents;

  auto ss = ostringstream{};
  ifstream input_file(filename);
  if (!input_file.good()) {
    cerr << "Could not open the file - '" << filename << "'" << endl;
    exit(EXIT_FAILURE);
  }

  ss << input_file.rdbuf();
  file_contents = ss.str();

  cout << file_contents;
  exit(EXIT_SUCCESS);
}

C++ でストリームオブジェクトを式にしてエラーが発生したかどうかを調べる

前述のメソッド fail および good は、コードをより読みやすくするため、現代の C++ スタイルでストリームエラーを評価するために推奨される方法です。また、ストリームオブジェクト自体を式として指定して、そのオブジェクトにエラーが発生したかどうかをチェックすることもできます。後者の方法はより暗号化されていますが、エラーチェック条件文を実装するための正しい方法です。

#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>

using std::cerr;
using std::cout;
using std::endl;
using std::ifstream;
using std::ostringstream;
using std::string;

int main() {
  string filename("tmp.txt");
  string file_contents;

  auto ss = ostringstream{};
  ifstream input_file(filename);
  if (!input_file) {
    cerr << "Could not open the file - '" << filename << "'" << endl;
    exit(EXIT_FAILURE);
  }

  ss << input_file.rdbuf();
  file_contents = ss.str();

  cout << file_contents;
  exit(EXIT_SUCCESS);
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ IO