C++中string流的具體使用
一、概覽與類體系
C++ 提供三種基于內(nèi)存字符串的流,定義在 <sstream> 中:
- std::istringstream:輸入流,從已有字符串中讀取并解析。
- std::ostringstream:輸出流,向內(nèi)部緩沖區(qū)寫入內(nèi)容,最終取回為字符串。
- std::stringstream:讀寫流,兼具 istringstream 和 ostringstream 的功能。
它們都繼承自 std::basic_iostream<char>,可使用所有流操作符與格式化工具。
二、常見用法
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ì)跳過空白,并嘗試按目標(biāo)類型解析。
- 解析失敗時(shí),流會(huì)置
failbit,后續(xù)操作將不中斷程序,除非打開異常模式。
3. 讀寫混合
std::stringstream ss; ss << "X=" << 10 << ";Y=" << 20; // 重設(shè)讀寫位置到開頭 ss.seekg(0); // 逐字符讀取、跳過標(biāo)識(shí) char ch; int x, y; ss >> ch >> ch >> x; // 假設(shè)格式 "X=10" ss >> ch >> ch >> y; // 跳過 ";Y="
- seekg/seekp 可重定位讀/寫指針,方便混合使用。
- 在寫完后若要讀,通常要 ss.seekg(0);同理,由讀轉(zhuǎn)寫可用 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。 - 多語種/寬字符:對(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";
}
// 讀寫混合:累加偏移
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:讀寫一體,用于需要往返操作的場(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語言與c++基礎(chǔ)知識(shí)點(diǎn)(必看)
下面小編就為大家?guī)硪黄猚語言與c++基礎(chǔ)知識(shí)點(diǎn)(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07
C語言從猜數(shù)字游戲中理解數(shù)據(jù)結(jié)構(gòu)
猜數(shù)字是興起于英國(guó)的益智類小游戲,起源于20世紀(jì)中期,一般由兩個(gè)人或多人玩,也可以由一個(gè)人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來用這個(gè)游戲案例理解數(shù)據(jù)結(jié)構(gòu)2022-04-04
C++中volatile和mutable關(guān)鍵字用法詳解
這篇文章主要介紹了C++中volatile和mutable關(guān)鍵字用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
將正小數(shù)轉(zhuǎn)化為2-9進(jìn)制小數(shù)的實(shí)現(xiàn)方法
本篇文章對(duì)正小數(shù)轉(zhuǎn)化為2-9進(jìn)制小數(shù)的實(shí)現(xiàn)方法進(jìn)行了介紹,需要的朋友參考下2013-05-05

