Usa il metodo cin.fail in C++

Jinku Hu 12 ottobre 2023
  1. Utilizzare il metodo fail per verificare se si verifica un errore sull’oggetto flusso in C++
  2. Utilizzare il metodo good per verificare se si verifica un errore sull’oggetto flusso in C++
  3. Usa oggetto flusso come espressione per verificare se si verifica un errore in C++
Usa il metodo cin.fail 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);
}
Autore: 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

Articolo correlato - C++ IO