Verwendung der Methode cin.fail in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden der fail-Methode, um zu prüfen, ob bei einem Stream-Objekt in C++ ein Fehler auftritt
  2. Verwenden Sie die Methode good, um zu prüfen, ob ein Fehler im Stream-Objekt in C++ auftritt
  3. Stream-Objekt als Ausdruck verwenden, um zu prüfen, ob ein Fehler in C++ auftritt
Verwendung der Methode cin.fail in C++

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

Verwandter Artikel - C++ IO