Utiliser la méthode cin.fail en C++
-
Utiliser la méthode
fail
pour vérifier si une erreur se produit sur un objet de flux en C++ -
Utilisez la méthode
good
pour vérifier si une erreur se produit sur un objet de flux en C++ - Utiliser l’objet Stream comme expression pour vérifier si une erreur survient en C++
Cet article présente plusieurs méthodes pour utiliser correctement la méthode fail
sur des objets de flux en C++.
Utiliser la méthode fail
pour vérifier si une erreur se produit sur un objet de flux en C++
La méthode fail
est la fonction intégrée de la classe basic_ios
, et elle peut être appelée pour vérifier si le flux donné a un état erroné. La fonction ne prend aucun argument et retourne la valeur booléenne true
si une erreur est survenue sur l’objet stream. Notez que les objets stream ont plusieurs bits constants pour décrire leur état actuel. Ces constantes sont - goodbit
, eofbit
, failbit
et badbit
. Si failbit
est activé, cela signifie que l’opération a échoué, mais que le flux lui-même est dans un bon état. Le badbit
est activé lorsque le flux est corrompu. La méthode fail
renvoie vrai si bit
ou failbit
est défini sur un objet de flux donné.
#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);
}
Utilisez la méthode good
pour vérifier si une erreur se produit sur un objet de flux en C++
On peut aussi appeler la fonction intégrée good
pour vérifier si l’objet du flux est en bon état. Puisque la constante goodbit
étant définie dans l’état du flux signifie qu’un bit sur deux est effacé, la vérifier implique le bon état du flux. Notez que ces constantes sont définies dans la classe ios_base
et peuvent être appelées std::ios_base::goodbit
. L’exemple de code suivant montre que la négation logique de la valeur de retour de la méthode good
peut être spécifiée comme condition pour vérifier les éventuels échecs du flux.
#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);
}
Utiliser l’objet Stream comme expression pour vérifier si une erreur survient en C++
Les méthodes précédentes - fail
et good
- sont recommandées pour évaluer les erreurs de flux dans le style C++ moderne, car elles rendent le code plus lisible. On peut aussi spécifier l’objet du flux lui-même comme une expression pour vérifier si une erreur s’y produit. Cette dernière méthode est plus cryptique mais c’est la bonne façon d’implémenter les déclarations de condition de vérification d’erreur.
#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);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook