欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中string流的具體使用

 更新時(shí)間:2025年06月11日 10:00:41   作者:點(diǎn)云SLAM  
本文主要介紹了C++中string流的具體使用,包括istringstream、ostringstream、stringstream這三種類型的使用,具有一定的參考價(jià)值,感興趣的可以了解一下

一、概覽與類體系

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ǔ)言快速排序與二分查找算法示例

    C語(yǔ)言快速排序與二分查找算法示例

    這篇文章主要介紹了C語(yǔ)言快速排序與二分查找算法,涉及C語(yǔ)言隨機(jī)數(shù)生成、快速排序及二分查找等算法相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-01-01
  • 詳解C++編程中的重載流插入運(yùn)算符和流提取運(yùn)算符

    詳解C++編程中的重載流插入運(yùn)算符和流提取運(yùn)算符

    這篇文章主要介紹了詳解C++編程中的重載流插入運(yùn)算符和流提取運(yùn)算符,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++實(shí)現(xiàn)循環(huán)隊(duì)列

    C++實(shí)現(xiàn)循環(huán)隊(duì)列

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)循環(huán)隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • Qt利用QNetwork實(shí)現(xiàn)上傳數(shù)據(jù)的示例代碼

    Qt利用QNetwork實(shí)現(xiàn)上傳數(shù)據(jù)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Qt如何利用QNetwork實(shí)現(xiàn)上傳數(shù)據(jù)的 功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-02-02
  • C++實(shí)現(xiàn)二叉樹(shù)的堂兄弟節(jié)點(diǎn)查詢

    C++實(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-04
  • C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別

    C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別

    本文主要介紹了C++中的局部變量、全局變量、局部靜態(tài)變量、全局靜態(tài)變量的區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • c++ 面向?qū)ο笤O(shè)計(jì)五大原則

    c++ 面向?qū)ο笤O(shè)計(jì)五大原則

    這篇文章主要介紹了c++ 面向?qū)ο笤O(shè)計(jì)五大原則,幫助大家更好的理解和學(xué)習(xí)c++面向?qū)ο笤O(shè)計(jì),感興趣的朋友可以了解下
    2020-08-08
  • C++淺析缺省參數(shù)的使用

    C++淺析缺省參數(shù)的使用

    所謂缺省參數(shù),顧名思義,就是在聲明函數(shù)的某個(gè)參數(shù)的時(shí)候?yàn)橹付ㄒ粋€(gè)默認(rèn)值,在調(diào)用該函數(shù)的時(shí)候如果采用該默認(rèn)值,你就無(wú)須指定該參數(shù)。缺省參數(shù)使用主要規(guī)則:調(diào)用時(shí)你只能從最后一個(gè)參數(shù)開(kāi)始進(jìn)行省略,換句話說(shuō),如果你要省略一個(gè)參數(shù),你必須省略它后面所有的參數(shù)
    2022-05-05
  • C語(yǔ)言常見(jiàn)排序算法之交換排序(冒泡排序,快速排序)

    C語(yǔ)言常見(jiàn)排序算法之交換排序(冒泡排序,快速排序)

    這篇文章主要介紹了C語(yǔ)言常見(jiàn)排序算法之交換排序(冒泡排序,快速排序),冒泡排序即Bubble?Sort,類似于水中冒泡,較大的數(shù)沉下去,較小的數(shù)慢慢冒起來(lái),假設(shè)從小到大,即為較大的數(shù)慢慢往后排,較小的數(shù)慢慢往前排
    2022-07-07
  • C++實(shí)現(xiàn)LeetCode(32.最長(zhǎng)有效括號(hào))

    C++實(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

最新評(píng)論