C++中string流的具體使用
一、概覽與類體系
C++ 提供三種基于內(nèi)存字符串的流,定義在 <sstream> 中:
- std::istringstream:輸入流,從已有字符串中讀取并解析。
- std::ostringstream:輸出流,向內(nèi)部緩沖區(qū)寫(xiě)入內(nèi)容,最終取回為字符串。
- std::stringstream:讀寫(xiě)流,兼具 istringstream 和 ostringstream 的功能。
它們都繼承自 std::basic_iostream<char>
,可使用所有流操作符與格式化工具。
二、常見(jiàn)用法
1. 構(gòu)造與取出字符串
std::ostringstream oss; // 默認(rèn)空緩沖 oss << "Value=" << 42 << ", Pi=" << std::fixed << std::setprecision(3) << 3.14159; // 獲取結(jié)果 std::string s = oss.str(); // s == "Value=42, Pi=3.142"
- str():獲取當(dāng)前緩沖區(qū)的字符串。
- str(const std::string&):重置緩沖區(qū)內(nèi)容。
2. 字符串解析
std::string line = "123 45.6 OK"; // 將 line 內(nèi)容作為流緩沖 std::istringstream iss(line); int a; double b; std::string status; // 按空白自動(dòng)切分并轉(zhuǎn)換 if (iss >> a >> b >> status) { // a==123, b==45.6, status=="OK" } // 檢查是否完全消費(fèi)或錯(cuò)誤 if (iss.fail() && !iss.eof()) { // 轉(zhuǎn)換中發(fā)生格式錯(cuò)誤 }
- 運(yùn)算符>> 會(huì)跳過(guò)空白,并嘗試按目標(biāo)類型解析。
- 解析失敗時(shí),流會(huì)置
failbit
,后續(xù)操作將不中斷程序,除非打開(kāi)異常模式。
3. 讀寫(xiě)混合
std::stringstream ss; ss << "X=" << 10 << ";Y=" << 20; // 重設(shè)讀寫(xiě)位置到開(kāi)頭 ss.seekg(0); // 逐字符讀取、跳過(guò)標(biāo)識(shí) char ch; int x, y; ss >> ch >> ch >> x; // 假設(shè)格式 "X=10" ss >> ch >> ch >> y; // 跳過(guò) ";Y="
- seekg/seekp 可重定位讀/寫(xiě)指針,方便混合使用。
- 在寫(xiě)完后若要讀,通常要 ss.seekg(0);同理,由讀轉(zhuǎn)寫(xiě)可用 ss.seekp(0, std::ios::end)。
三、格式控制與狀態(tài)檢查
格式化:與標(biāo)準(zhǔn)流一致,可用 <iomanip> 中的操縱器,如 std::hex、std::setw、std::setfill、std::boolalpha、std::fixed、std::scientific 等調(diào)整輸出格式。
狀態(tài)位:用 good()、fail()、eof()、bad()、rdstate() 檢測(cè)流狀態(tài);用 clear() 重置。
異常模式:
iss.exceptions(std::ios::failbit | std::ios::badbit); try { int v; iss >> v; // 解析失敗即拋異常 } catch (const std::ios_base::failure& e) { // 處理錯(cuò)誤 }
默認(rèn)不會(huì)拋。
四、性能與注意事項(xiàng)
- 避免頻繁 str() 調(diào)用:每次
str()
都會(huì)拷貝緩沖區(qū)字符串,影響性能。可在最后一次取用時(shí)再調(diào)用。 - 預(yù)分配緩沖:可用
ss.str().reserve(n)
或先構(gòu)造帶初始字符串的stringstream
,減少動(dòng)態(tài)分配。 - 切換格式后狀態(tài)保留:如果你在一個(gè)流上設(shè)置了某個(gè)格式(如
std::hex
),它會(huì)一直生效, remember to reset(std::dec
)。 - 注意空白和分隔:
>>
默認(rèn)以空白分隔,解析整行或含空格的字段時(shí)要用std::getline
。 - 多語(yǔ)種/寬字符:對(duì)于 Unicode 或?qū)捵址髡?qǐng)使用
std::basic_stringstream<wchar_t>
。
五、綜合示例
#include <iostream> #include <sstream> #include <iomanip> int main() { // 構(gòu)建字符串 std::ostringstream oss; oss << "Point(" << std::setw(2) << std::setfill('0') << 7 << "," << std::fixed << std::setprecision(1) << 3.14 << ")"; std::string desc = oss.str(); // "Point(07,3.1)" std::cout << desc << "\n"; // 解析回?cái)?shù)值 std::istringstream iss(desc); char ch; int ix; double dy; if ( (iss >> ch >> ch >> ix >> ch >> dy >> ch).good() ) { std::cout << "Parsed: x=" << ix << ", y=" << dy << "\n"; } else { std::cerr << "Parse error\n"; } // 讀寫(xiě)混合:累加偏移 std::stringstream ss("100 200 300"); int sum = 0, v; while (ss >> v) sum += v; // sum=600 std::cout << "Sum=" << sum << "\n"; return 0; }
小結(jié)
- std::ostringstream:安全構(gòu)建復(fù)雜字符串/格式化輸出。
- std::istringstream:高效拆解、解析已知格式的文本。
- std::stringstream:讀寫(xiě)一體,用于需要往返操作的場(chǎng)景。
- 始終關(guān)注流狀態(tài)和格式保留,并合理管理緩沖與性能。
掌握這些知識(shí),你就能在日志構(gòu)建、文本解析、動(dòng)態(tài)內(nèi)容生成等場(chǎng)景中,靈活高效地運(yùn)用 C++ 的字符串流。
到此這篇關(guān)于C++中string流的具體使用的文章就介紹到這了,更多相關(guān)C++ string流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C++編程中的重載流插入運(yùn)算符和流提取運(yùn)算符
這篇文章主要介紹了詳解C++編程中的重載流插入運(yùn)算符和流提取運(yùn)算符,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09C++實(shí)現(xiàn)循環(huán)隊(duì)列
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)循環(huán)隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01Qt利用QNetwork實(shí)現(xiàn)上傳數(shù)據(jù)的示例代碼
這篇文章主要為大家詳細(xì)介紹了Qt如何利用QNetwork實(shí)現(xiàn)上傳數(shù)據(jù)的 功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02C++實(shí)現(xiàn)二叉樹(shù)的堂兄弟節(jié)點(diǎn)查詢
C++實(shí)現(xiàn)二叉樹(shù)的堂兄弟節(jié)點(diǎn)查詢,是指在二叉樹(shù)中,找到兩個(gè)節(jié)點(diǎn)深度相同但父節(jié)點(diǎn)不同的節(jié)點(diǎn),即為堂兄弟節(jié)點(diǎn)。實(shí)現(xiàn)這一功能可以通過(guò)遍歷二叉樹(shù)并記錄節(jié)點(diǎn)深度和父節(jié)點(diǎn)來(lái)實(shí)現(xiàn)2023-04-04C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別
本文主要介紹了C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02C語(yǔ)言常見(jiàn)排序算法之交換排序(冒泡排序,快速排序)
這篇文章主要介紹了C語(yǔ)言常見(jiàn)排序算法之交換排序(冒泡排序,快速排序),冒泡排序即Bubble?Sort,類似于水中冒泡,較大的數(shù)沉下去,較小的數(shù)慢慢冒起來(lái),假設(shè)從小到大,即為較大的數(shù)慢慢往后排,較小的數(shù)慢慢往前排2022-07-07C++實(shí)現(xiàn)LeetCode(32.最長(zhǎng)有效括號(hào))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(32.最長(zhǎng)有效括號(hào)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07