溫馨提示×

stringstream怎樣處理異常情況

小樊
81
2024-10-16 14:56:17
欄目: 編程語言

stringstream 是 C++ 中的一個類,它位于 <sstream> 頭文件中。這個類允許你使用流操作符 <<>> 來讀取和寫入字符串。在處理異常情況時,stringstream 可以幫助你以結(jié)構(gòu)化的方式解析字符串。

以下是一些使用 stringstream 處理異常情況的示例:

  1. 檢查讀取操作是否成功: 當你使用 >> 操作符從 stringstream 中讀取數(shù)據(jù)時,如果讀取失敗,該操作符會設(shè)置 failbit。你可以使用 fail() 成員函數(shù)來檢查是否設(shè)置了 failbit
#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::stringstream ss("123 456 789");
    int a, b, c;

    ss >> a >> b >> c;

    if (ss.fail()) {
        std::cerr << "讀取失敗!" << std::endl;
    } else {
        std::cout << "讀取成功: a="<< a << ", b="<< b << ", c="<< c << std::endl;
    }

    return 0;
}
  1. 處理非數(shù)字字符: 如果你嘗試從 stringstream 中讀取一個不存在的值,>> 操作符會設(shè)置 failbit。你可以使用 ignore() 成員函數(shù)來忽略無效字符,并繼續(xù)讀取。
#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::stringstream ss("abc 123 def 456");
    int a, b;
    std::string s;

    ss >> s >> a; // 讀取字符串 "abc" 和整數(shù) 123
    ss.ignore(std::numeric_limits<std::streamsize>::max(), ' '); // 忽略空格
    ss >> b; // 讀取整數(shù) 456

    if (ss.fail()) {
        std::cerr << "讀取失敗!" << std::endl;
    } else {
        std::cout << "讀取成功: a="<< a << ", b="<< b << std::endl;
    }

    return 0;
}
  1. 自定義錯誤處理: 你可以通過重載 <<>> 操作符來自定義錯誤處理邏輯。例如,你可以為 stringstream 類創(chuàng)建一個自定義的派生類,并在其中實現(xiàn)自己的錯誤處理機制。
#include <iostream>
#include <sstream>
#include <string>

class MyStream : public std::stringstream {
public:
    using std::stringstream::operator>>;

    void checkError() {
        if (fail()) {
            throw std::runtime_error("讀取失敗!");
        }
    }
};

int main() {
    MyStream ss("123 456 789");
    int a, b, c;

    ss >> a >> b >> c;
    ss.checkError();

    std::cout << "讀取成功: a="<< a << ", b="<< b << ", c="<< c << std::endl;

    return 0;
}

在這個示例中,我們創(chuàng)建了一個名為 MyStream 的自定義類,它繼承自 std::stringstream。我們重載了 >> 操作符,并在其中調(diào)用了 checkError() 函數(shù)來檢查是否發(fā)生了讀取錯誤。如果發(fā)生錯誤,我們拋出一個 std::runtime_error 異常。在主函數(shù)中,我們使用 try-catch 塊來捕獲并處理這個異常。

0