C++ で cin.fail メソッドを使用する
-
C++ でストリームオブジェクトにエラーが発生したかどうかを調べるには
fail
メソッドを使用する -
C++ でストリームオブジェクトにエラーが発生したかどうかを調べるには
good
メソッドを用いる - C++ でストリームオブジェクトを式にしてエラーが発生したかどうかを調べる
この記事では、C++ でストリームオブジェクト上で fail
メソッドを正しく使用する複数の方法を示します。
C++ でストリームオブジェクトにエラーが発生したかどうかを調べるには fail
メソッドを使用する
fail
メソッドは basic_ios
クラスの組み込み関数であり、指定したストリームの状態に誤りがあったかどうかを検証するために呼び出すことができます。この関数は引数を取らず、ストリームオブジェクトにエラーが発生した場合はブール値 true
を返します。ストリームオブジェクトには、現在の状態を記述するための定数ビットがいくつかあることに注意してください。これらの定数は - goodbit
、eofbit
、failbit
、badbit
です。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);
}