1. 程式人生 > 其它 >04 | c++<sstream>帶給我們的優雅

04 | c++<sstream>帶給我們的優雅

問題導向


我們想要把各種不同的資料型別輸出的話?
就算是用printf也避免不了%d,%s等等複雜的東西。
我們的願望?
有這樣一個類似容器的東西,不管是什麼基本型別只要丟進去就會自動轉化為字串那太好了。有種萬眾歸一的感覺。

概述


定義了三個類:istringstream、ostringstream 和 stringstream,分別用來進行流的輸入、輸出和輸入輸出操作。本文以 stringstream 為主,介紹流的輸入和輸出操作。
主要用來進行資料型別轉換,由於 使用 string 物件來代替字元陣列(snprintf 方式),避免了緩衝區溢位的危險;而且,因為傳入引數和目標物件的型別會被自動推匯出來,所以不存在錯誤的格式化符號的問題。簡單說,相比 C 程式語言庫的資料型別轉換, 更加安全、自動和直接

三個主要用途


資料型別轉換

#include <string>
#include <sstream>
#include <iostream>
#include <stdio.h>
 
using namespace std;
 
int main()
{
    stringstream sstream;
    string strResult;
    int nValue = 1000;
 
    // 將int型別的值放入輸入流中
    sstream << nValue;
    // 從sstream中抽取前面插入的int型別的值,賦給string型別
    sstream >> strResult;
 
    cout << "[cout]strResult is: " << strResult << endl;
    printf("[printf]strResult is: %s\n", strResult.c_str());
 
    return 0;
}

多個字串的拼接

本示例介紹在 stringstream 中存放多個字串,實現多個字串拼接的目的(其實完全可以使用 string 類實現),同時,介紹 stringstream 類的清空方法。

#include <string>
#include <sstream>
#include <iostream>
 
using namespace std;
 
int main()
{
    stringstream sstream;
 
    // 將多個字串放入 sstream 中
    sstream << "first" << " " << "string,";
    sstream << " second string";
    cout << "strResult is: " << sstream.str() << endl;
 
    // 清空 sstream
    sstream.str("");
    sstream << "third string";
    cout << "After clear, strResult is: " << sstream.str() << endl;
 
    return 0;
}

從上述程式碼執行結果能夠知道:

  • 可以使用 str() 方法,將 stringstream 型別轉換為 string 型別;
  • 可以將多個字串放入 stringstream 中,實現字串的拼接目的;
  • 如果想清空 stringstream,必須使用 sstream.str(""); 方式;clear() 方法適用於進行多次資料型別轉換的場景。

stringstream的清空

清空 stringstream 有兩種方法:clear() 方法以及 str("") 方法,這兩種方法對應不同的使用場景。str("") 方法的使用場景,在上面的示例中已經介紹過了,這裡介紹 clear() 方法的使用場景。

#include <sstream>
#include <iostream>
 
using namespace std;
 
int main()
{
    stringstream sstream;
    int first, second;
 
    // 插入字串
    sstream << "456";
    // 轉換為int型別
    sstream >> first;
    cout << first << endl;
 
    // 在進行多次型別轉換前,必須先執行clear()
    sstream.clear();
 
    // 插入bool值
    sstream << true;
    // 轉換為int型別
    sstream >> second;
    cout << second << endl;
 
    return 0;
}

注意:在本示例涉及的場景下(多次資料型別轉換),必須使用 clear() 方法清空 stringstream,不使用 clear() 方法或使用 str("") 方法,都不能得到資料型別轉換的正確結果。下圖分別是未使用 clear() 方法、使用 str("") 方法代替 clear() 方法時的執行結果:

參考

https://blog.csdn.net/liitdar/article/details/82598039?