Utiliser la méthode cin.fail en C++

Jinku Hu 12 octobre 2023
  1. Utiliser la méthode fail pour vérifier si une erreur se produit sur un objet de flux en C++
  2. Utilisez la méthode good pour vérifier si une erreur se produit sur un objet de flux en C++
  3. Utiliser l’objet Stream comme expression pour vérifier si une erreur survient en C++
Utiliser la méthode cin.fail 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);
}
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - C++ IO