Usar el método cin.fail en C++

Jinku Hu 12 octubre 2023
  1. Usar el método del fail para comprobar si el error ocurre en el objeto de la corriente en C++
  2. Usa el método good para comprobar si el error ocurre en el objeto de la corriente en C++
  3. Usar el objeto de la corriente como expresión para comprobar si se produce un error en C++
Usar el método cin.fail en C++

Este artículo demostrará múltiples métodos para usar correctamente el método de fail en los objetos de la corriente en C++.

Usar el método del fail para comprobar si el error ocurre en el objeto de la corriente en C++

El método fail es la función incorporada de la clase basic_ios, y puede ser llamado para verificar si la corriente dada tiene un estado erróneo. La función no toma ningún argumento y devuelve el valor booleano true si se ha producido algún error en el objeto de la corriente. Nótese que los objetos de secuencia tienen varios bits constantes para describir su estado actual. Estas constantes son: goodbit, eofbit, failbit y badbit. Si se establece failbit, significa que la operación falló, pero el flujo en sí está en buen estado. badbit se pone cuando el flujo se corrompe. El método fail devuelve true si badbit o failbit se establece en un objeto de flujo dado.

#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);
}

Usa el método good para comprobar si el error ocurre en el objeto de la corriente en C++

Alternativamente, se puede llamar a la función good incorporada para comprobar si el objeto de la corriente está en buen estado. Dado que la constante goodbit que se establece en el estado de la corriente significa que todos los demás bits están limpios, comprobarla implica el buen estado de la corriente. Nótese que estas constantes están definidas dentro de la clase ios_base y pueden ser referidas como std::ios_base::goodbit. El siguiente ejemplo de código muestra que la negación lógica del valor de retorno del método good puede ser especificada como una condición para comprobar cualquier fallo en la secuencia.

#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);
}

Usar el objeto de la corriente como expresión para comprobar si se produce un error en C++

Los métodos anteriores - fail y good - son la forma recomendada de evaluar los errores de flujo en el estilo moderno de C++, ya que hace el código más legible. También se puede especificar el objeto de la corriente como una expresión para comprobar si se produce algún error en ella. Este último método es más críptico pero es la forma correcta de implementar las declaraciones de condición de comprobación de errores.

#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);
}
Autor: 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

Artículo relacionado - C++ IO