C++之std::stringstream的使用小結
1.簡介
std::stringstream 是 C++ 標準庫 <sstream> 頭文件提供的字符串流類,核心作用是在字符串和基本數(shù)據(jù)類型之間做轉換,以及靈活地拼接 / 分割字符串。它屬于內(nèi)存流(而非文件流),所有操作都在內(nèi)存中完成,效率高且使用靈活。
頭文件:
#include <sstream> // 核心:字符串流 #include <iostream> // 控制臺輸出(輔助) #include <string> // 處理字符串(輔助) using namespace std; // 簡化代碼,實際項目可按需省略
<sstream> 提供三個核心類(均繼承自 std::iostream):
類名 核心功能 類比 std::istringstream 只讀字符串流(輸入流) 類似 ifstream std::ostringstream 只寫字符串流(輸出流) 類似 ofstream std::stringstream 讀寫字符串流(雙向流) 類似 fstream
2.核心功能與示例
2.1.類型轉換(最常用)
stringstream 是 C++ 中靈活的類型轉換工具,可實現(xiàn)任意基本類型(int/float/double 等)與字符串的互轉,比 atoi/atof 或 C++11 的 std::to_string 更通用(支持多類型混合轉換)。
1.數(shù)字 → 字符串
// 單個數(shù)字轉字符串 int num = 123; ostringstream oss; oss << num; // 像輸出到控制臺一樣寫入字符串流 string str_num = oss.str(); // 獲取流中的字符串 cout << "int轉string:" << str_num << endl; // 輸出:123 // 多類型混合轉字符串 double pi = 3.14159; bool flag = true; ostringstream oss2; oss2 << "π = " << pi << ",是否有效:" << boolalpha << flag; string str_mix = oss2.str(); cout << str_mix << endl; // 輸出:π = 3.14159,是否有效:true
2.字符串 → 數(shù)字
// 字符串轉單個數(shù)字
string str = "456.789";
istringstream iss(str);
double d;
iss >> d; // 像從控制臺讀取一樣解析字符串
if (iss.fail()) { // 檢查轉換是否失?。ㄈ缱址菙?shù)字)
cerr << "轉換失??!" << endl;
} else {
cout << "string轉double:" << d << endl; // 輸出:456.789
}
// 字符串轉多個數(shù)字(按空格分割)
string str_multi = "10 20.5 300";
istringstream iss2(str_multi);
int a;
double b;
int c;
iss2 >> a >> b >> c;
cout << a << " " << b << " " << c << endl; // 輸出:10 20.5 3002.2.字符串拼接
ostringstream 比直接用 + 拼接字符串更高效(減少臨時字符串創(chuàng)建),尤其適合大量拼接場景。
// 低效方式:多次+拼接(產(chǎn)生臨時對象)
string s1 = "姓名:" + "張三" + ",年齡:" + to_string(20);
// 高效方式:ostringstream拼接
ostringstream oss;
oss << "姓名:" << "張三"
<< ",年齡:" << 20
<< ",分數(shù):" << 95.5;
string s2 = oss.str();
cout << s2 << endl; // 輸出:姓名:張三,年齡:20,分數(shù):95.52.3.字符串分割
istringstream 配合 >> 或 getline() 可輕松分割字符串(按空格、逗號、冒號等分隔符)。
1.按空格 / 制表符分割(默認)
string str = "apple banana orange grape";
istringstream iss(str);
string word;
// >> 自動跳過空格/制表符/換行符,讀取到下一個分隔符為止
while (iss >> word) {
cout << word << endl;
}
// 輸出:
// apple
// banana
// orange
// grape2.按自定義分隔符分割(如逗號、冒號)
需配合 getline() 指定分隔符:
string str = "1,2,3,4,5";
istringstream iss(str);
string token;
// getline(流, 接收字符串, 分隔符)
while (getline(iss, token, ',')) {
cout << token << endl;
}
// 輸出:
// 1
// 2
// 3
// 4
// 5
// 按冒號分割示例
string str2 = "name:張三:age:20:score:95.5";
istringstream iss2(str2);
string t;
while (getline(iss2, t, ':')) {
cout << t << endl;
}3.進階用法
1.清空 / 重置 stringstream
stringstream 的清空需注意兩個關鍵點:
clear():僅重置流的狀態(tài)標志(如 eof/fail 標志),不清空內(nèi)部字符串;str(""):清空內(nèi)部存儲的字符串內(nèi)容;- 如需復用流,需同時調(diào)用
clear()+str("")。
stringstream ss;
ss << "test 123";
cout << "初始內(nèi)容:" << ss.str() << endl; // 輸出:test 123
// 錯誤:僅clear(),內(nèi)容仍在
ss.clear();
cout << "僅clear()后:" << ss.str() << endl; // 輸出:test 123
// 正確:清空內(nèi)容 + 重置狀態(tài)
ss.str(""); // 清空內(nèi)容
ss.clear(); // 重置狀態(tài)(避免之前的狀態(tài)影響后續(xù)操作)
ss << "new content";
cout << "重置后:" << ss.str() << endl; // 輸出:new content2.獲取 / 設置流的內(nèi)容
str():無參數(shù) → 獲取流中的字符串;str(const string& s):有參數(shù) → 設置流的初始內(nèi)容。
stringstream ss;
ss.str("初始內(nèi)容"); // 設置初始內(nèi)容
cout << ss.str() << endl; // 輸出:初始內(nèi)容
ss << " + 追加內(nèi)容";
cout << ss.str() << endl; // 輸出:初始內(nèi)容 + 追加內(nèi)容4.注意事項
- 清空誤區(qū):切勿僅用
clear()清空內(nèi)容,必須配合str(""); - 性能優(yōu)勢:拼接大量字符串時,
ostringstream遠優(yōu)于string::operator+(減少內(nèi)存拷貝); - 錯誤處理:類型轉換 / 分割時,需檢查
fail()/good()狀態(tài),避免無效轉換(如字符串 "abc" 轉 int); - 線程安全:
stringstream非線程安全,多線程操作需加鎖; - 內(nèi)存占用:
stringstream會緩存數(shù)據(jù),大量數(shù)據(jù)處理后及時清空或析構,避免內(nèi)存泄漏; - bool 類型輸出:默認輸出
1/0,需用boolalpha操縱符輸出true/false:
ostringstream oss; oss << boolalpha << true; // 輸出 true oss << noboolalpha << true; // 輸出 1(恢復默認)
5.總結
std::stringstream 是 C++ 處理字符串的 “瑞士軍刀”,核心價值:
- 靈活的類型轉換(數(shù)字↔字符串);
- 高效的字符串拼接;
- 便捷的字符串分割;
- 所有操作在內(nèi)存中完成,無 IO 開銷,性能優(yōu)異。
實際開發(fā)中,優(yōu)先用 istringstream 處理 “讀 / 解析”、ostringstream 處理 “寫 / 拼接”,stringstream 僅在需要雙向操作時使用(略占內(nèi)存)。
到此這篇關于C++之std::stringstream的使用小結的文章就介紹到這了,更多相關C++ std::stringstream內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
VC++中HTControl控件類之CHTRichEdit富文本編輯控件實例
這篇文章主要介紹了VC++中HTControl控件類之CHTRichEdit富文本編輯控件,是一個比較實用的功能,需要的朋友可以參考下2014-08-08
使用C++進行Cocos2d-x游戲開發(fā)入門過程中的要點解析
這篇文章主要介紹了使用C++進行Cocos2d-x游戲開發(fā)入門過程中的要點解析,主要針對畫面變化以及觸摸響應方面,需要的朋友可以參考下2015-12-12
C++讀入"N,X,Y,Z"格式文本文件到Eigen3 Matrix
這篇文章主要介紹了C++讀入"N,X,Y,Z"格式文本文件到Eigen3 Matrix,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04

