stringstream
是 C++ 中的一個類,它位于 <sstream>
頭文件中。這個類允許你使用流操作符 <<
和 >>
來讀取和寫入字符串。在處理異常情況時,stringstream
可以幫助你以結構化的方式解析字符串。
以下是一些使用 stringstream
處理異常情況的示例:
>>
操作符從 stringstream
中讀取數據時,如果讀取失敗,該操作符會設置 failbit
。你可以使用 fail()
成員函數來檢查是否設置了 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;
}
stringstream
中讀取一個不存在的值,>>
操作符會設置 failbit
。你可以使用 ignore()
成員函數來忽略無效字符,并繼續讀取。#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" 和整數 123
ss.ignore(std::numeric_limits<std::streamsize>::max(), ' '); // 忽略空格
ss >> b; // 讀取整數 456
if (ss.fail()) {
std::cerr << "讀取失敗!" << std::endl;
} else {
std::cout << "讀取成功: a="<< a << ", b="<< b << std::endl;
}
return 0;
}
<<
和 >>
操作符來自定義錯誤處理邏輯。例如,你可以為 stringstream
類創建一個自定義的派生類,并在其中實現自己的錯誤處理機制。#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;
}
在這個示例中,我們創建了一個名為 MyStream
的自定義類,它繼承自 std::stringstream
。我們重載了 >>
操作符,并在其中調用了 checkError()
函數來檢查是否發生了讀取錯誤。如果發生錯誤,我們拋出一個 std::runtime_error
異常。在主函數中,我們使用 try-catch
塊來捕獲并處理這個異常。