Verwendung der Methode cin.fail in C++
-
Verwenden der
fail
-Methode, um zu prüfen, ob bei einem Stream-Objekt in C++ ein Fehler auftritt -
Verwenden Sie die Methode
good
, um zu prüfen, ob ein Fehler im Stream-Objekt in C++ auftritt - Stream-Objekt als Ausdruck verwenden, um zu prüfen, ob ein Fehler in C++ auftritt
In diesem Artikel werden mehrere Methoden zur korrekten Verwendung der fail
-Methode auf Stream-Objekten in C++ vorgestellt.
Verwenden der fail
-Methode, um zu prüfen, ob bei einem Stream-Objekt in C++ ein Fehler auftritt
Die Methode fail
ist eine eingebaute Funktion der Klasse basic_ios
, die aufgerufen werden kann, um zu überprüfen, ob der angegebene Stream einen fehlerhaften Zustand hat. Die Funktion nimmt keine Argumente entgegen und gibt den booleschen Wert true
zurück, wenn ein Fehler am Stream-Objekt aufgetreten ist. Beachten Sie, dass Stream-Objekte mehrere konstante Bits haben, um ihren aktuellen Zustand zu beschreiben. Diese Konstanten sind - goodbit
, eofbit
, failbit
und badbit
. Wenn failbit
gesetzt ist, bedeutet dies, dass die Operation fehlgeschlagen ist, aber der Stream selbst sich in einem guten Zustand befindet. badbit
wird gesetzt, wenn der Stream beschädigt wird. Die Methode fail
gibt true zurück, wenn badbit
oder failbit
auf ein gegebenes Stream-Objekt gesetzt ist.
#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);
}
Verwenden Sie die Methode good
, um zu prüfen, ob ein Fehler im Stream-Objekt in C++ auftritt
Alternativ kann man die eingebaute Funktion good
aufrufen, um zu prüfen, ob sich das Stream-Objekt in einem guten Zustand befindet. Da die Konstante goodbit
, die im Stream-Zustand gesetzt ist, bedeutet, dass jedes andere Bit gelöscht ist, impliziert ihre Überprüfung den guten Zustand des Streams. Beachten Sie, dass diese Konstanten innerhalb der Klasse ios_base
definiert sind und als std::ios_base::goodbit
bezeichnet werden können. Das folgende Codebeispiel zeigt, dass die logische Negation des Rückgabewerts der Methode good
als Bedingung angegeben werden kann, um den Stream auf Fehler zu prüfen.
#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);
}
Stream-Objekt als Ausdruck verwenden, um zu prüfen, ob ein Fehler in C++ auftritt
Die vorherigen Methoden - fail
und good
- sind die empfohlene Methode zur Auswertung von Stream-Fehlern im modernen C++-Stil, da sie den Code lesbarer macht. Man kann auch das Stream-Objekt selbst als Ausdruck angeben, um zu prüfen, ob ein Fehler an ihm auftritt. Die letztere Methode ist kryptischer, aber die korrekte Art, die Fehlerprüfungs-Bedingungsanweisungen zu implementieren.
#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