Usar o método cin.fail em C++
-
Utilizar o método
fail
para verificar se ocorre erro em objectos em C++ -
Utilizar o método
good
para verificar se ocorre erro no objecto stream em C++ - Utilizar Stream Object como Expressão para verificar se ocorre um erro 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);
}
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