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

Jinku Hu 2023年1月30日 2021年1月4日
  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 <iostream>
#include <fstream>
#include <vector>
#include <sstream>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::ifstream; using std::ostringstream;

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 <iostream>
#include <fstream>
#include <vector>
#include <sstream>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::ifstream; using std::ostringstream;

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 <iostream>
#include <fstream>
#include <vector>
#include <sstream>

using std::cout; using std::cerr;
using std::endl; using std::string;
using std::ifstream; using std::ostringstream;

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

相關文章 - C++ IO