Usar o método cin.fail em C++

Jinku Hu 12 outubro 2023
  1. Utilizar o método fail para verificar se ocorre erro em objectos em C++
  2. Utilizar o método good para verificar se ocorre erro no objecto stream em C++
  3. Utilizar Stream Object como Expressão para verificar se ocorre um erro em C++
Usar o método cin.fail em C++

Este artigo demonstrará múltiplos métodos de utilização correcta do método fail em objectos em C++.

Utilizar o método fail para verificar se ocorre erro em objectos em C++

O método fail é a função integrada da classe basic_ios, e pode ser chamado para verificar se o fluxo dado tem um estado erróneo. A função não aceita argumentos e devolve o valor booleano true se tiver ocorrido algum erro no objecto do fluxo. Note-se que os objectos de fluxo têm vários bits constantes para descrever o seu estado actual. Estas constantes são - goodbit, eofbit, failbit e badbit. Se failbit estiver definido, significa que a operação falhou, mas o próprio fluxo está num bom estado. O badbit é definido quando o fluxo é corrompido. O método fail retorna verdadeiro se o badbit ou failbit estiver definido num determinado objecto de fluxo.

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

Utilizar o método good para verificar se ocorre erro no objecto stream em C++

Em alternativa, pode-se chamar a função good incorporada para verificar se o objecto do fluxo está em bom estado. Uma vez que a goodbit constante a ser definida no estado do fluxo significa que cada outro bit é limpo, verificá-lo implica o bom estado do fluxo. Note-se que estas constantes são definidas dentro da classe ios_base e podem ser referidas como std::ios_base::goodbit. O exemplo de código seguinte mostra que a negação lógica do valor de retorno do método good pode ser especificada como condição para verificar a existência de eventuais falhas no fluxo.

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

Utilizar Stream Object como Expressão para verificar se ocorre um erro em C++

Os métodos anteriores - fail e good são uma forma recomendada de avaliar os erros do fluxo no estilo C++ moderno, uma vez que torna o código mais legível. Também se pode especificar o próprio objecto do fluxo como expressão para verificar se ocorre algum erro no mesmo. Este último método é mais enigmático mas a forma correcta de implementar as declarações de condição de verificação de erros.

#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

Artigo relacionado - C++ IO