在 C++ 中使用 cin.fail 方法

Jinku Hu 2023年10月12日
  1. 在 C++ 中使用 fail 方法檢查流物件是否發生錯誤
  2. 在 C++ 中使用 good 方法檢查流物件是否發生錯誤
  3. 在 C++ 中使用流物件作為表示式來檢查是否發生錯誤
在 C++ 中使用 cin.fail 方法

本文將演示在 C++ 中對流物件正確使用 fail 方法的多種方法。

在 C++ 中使用 fail 方法檢查流物件是否發生錯誤

fail 方法是 basic_ios 類的內建函式,可以呼叫它來驗證給定的流是否有錯誤狀態。該函式不接受任何引數,如果流物件發生任何錯誤,則返回布林值 true。注意,流物件有幾個常數位來描述它們的當前狀態。這些常數是-goodbiteofbitfailbit badbit。如果設定了 failbit,意味著操作失敗,但流本身處於良好狀態。badbit 是在流被破壞時設定的。如果給定的流物件上設定了 badbitfailbitfail 方法返回 true

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

在 C++ 中使用 good 方法檢查流物件是否發生錯誤

另外,也可以呼叫 good 內建函式來檢查流物件是否處於良好狀態。由於 goodbit 常量在流狀態下被設定,意味著其他每一個位都被清除,檢查它意味著流的良好狀態。注意,這些常量是在類 ios_base 中定義的,可以稱為 std::ios_base::goodbit。下面的程式碼示例顯示,可以指定 good 方法返回值的邏輯否定作為檢查流上任何故障的條件。

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

在 C++ 中使用流物件作為表示式來檢查是否發生錯誤

前面的方法 - failgood 是用現代 C++ 風格評估流錯誤的推薦方法,因為它使程式碼更易讀。我們也可以將流物件本身指定為一個表示式來檢查是否有任何錯誤發生。後一種方法比較神祕,但卻是實現錯誤檢查條件語句的正確方法。

#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);
}
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ IO