Usa il metodo cin.fail in C++
-
Utilizzare il metodo
fail
per verificare se si verifica un errore sull’oggetto flusso in C++ -
Utilizzare il metodo
good
per verificare se si verifica un errore sull’oggetto flusso in C++ - Usa oggetto flusso come espressione per verificare se si verifica un errore in C++
Questo articolo illustrerà diversi metodi per utilizzare correttamente il metodo fail
sugli oggetti stream in C++.
Utilizzare il metodo fail
per verificare se si verifica un errore sull’oggetto flusso in C++
Il metodo fail
è la funzione incorporata della classe basic_ios
e può essere chiamato per verificare se il flusso specificato ha uno stato errato. La funzione non accetta argomenti e restituisce il valore booleano true
se si è verificato un errore sull’oggetto stream. Notare che gli oggetti stream hanno diversi bit costanti per descrivere il loro stato corrente. Queste costanti sono - goodbit
, eofbit
, failbit
e badbit
. Se failbit
è impostato, significa che l’operazione non è riuscita, ma lo stream stesso è in buono stato. badbit
viene impostato quando il flusso viene danneggiato. Il metodo fail
restituisce true se badbit
o failbit
è impostato su un dato oggetto stream.
#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);
}
Utilizzare il metodo good
per verificare se si verifica un errore sull’oggetto flusso in C++
In alternativa, si può chiamare la funzione incorporata good
per verificare se l’oggetto stream è in buono stato. Poiché la costante goodbit
impostata nello stato stream significa che ogni altro bit viene cancellato, controllarlo implica lo stato buono del flusso. Notare che queste costanti sono definite nella classe ios_base
e possono essere chiamate std::ios_base::goodbit
. Il seguente esempio di codice mostra che la negazione logica del valore restituito dal metodo good
può essere specificata come condizione per verificare eventuali errori nel flusso.
#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);
}
Usa oggetto flusso come espressione per verificare se si verifica un errore in C++
I metodi precedenti - fail
e good
sono metodi consigliati per valutare gli errori di flusso nel moderno stile C++, poiché rendono il codice più leggibile. Si può anche specificare l’oggetto stream stesso come un’espressione per controllare se si verificano errori su di esso. Quest’ultimo metodo è più criptico ma è il modo corretto per implementare le istruzioni per il controllo degli errori.
#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