[C++] StringStream-int和sting轉換的另一種方案與清空StringStream

[C++] StringStream-int和sting轉換的另一種方案與清空StringStream
StringStream可以來做int與String類別的之間的轉換,記錄一下轉換的過程與如果要繼續使用StringStream時的清空資料的方式

前言

 


 

今天上課偶然第一次看到StringStream這個類別,於是筆記一下比較常用來做的部分

StringStream 是一個專門用來處理讀取或寫入到String的類別。

透過StringStream 可以幫我做們做字串的處理

intro

不過,最常見的使用方法是拿StringStream來做字串的分割(空白切割)

或int與String類別的之間的轉換,這邊就來記錄一下轉換的過程與如果要繼續使用StringStream時的清空資料的方式

 

使用StringStream做string int之間轉換

 


 

在使用StringStream前要先加入sstream標頭檔


#include <sstream>

 

int的數字轉換成string

stringstream 也具備了使用<<與>>的串流運算子來讀取或寫入


stringstream ss;
int number  = 123456;
ss << number; //把int型態變數寫入到stringstream

cout << "int to string" <<endl;
string convert_str;
ss >>  convert_str;  //透過串流運算子寫到string類別即可

cout << "number:" << number <<endl;
cout << "convert to str type:" << convert_str <<endl;
cout << "string to int" <<endl;

int_to_string

 

string字串數字轉int


stringstream ss;

string numberStr = "654321";
int num;
ss << numberStr; 
ss >> num;

cout << "str type:" << numberStr <<endl;
cout << "convert to num:" << num <<endl;

string_to_int

 

 

檢查有無轉型成功與其他型態的轉型例子

上述除了做int之間的轉換之外,stringstream也可以針對float、drouble等型態,除此之外我們也可以檢查轉型時是否成功

以下是把string轉成double的例子 與檢查有無轉成功


stringstream ss("13.5");
double d;
ss >> d;
if(!ss) cout << "error type"<<endl ; //check is convert successfully
else cout << d<< endl;

 

清空stringstream

 


 

有些時候我們可能會繼續沿用先前的stringstream,這時候便要記得清空先前的資料

先看以下的例子,是我們直接使用沒有做任何清空的動作


stringstream ss;

int number  = 12345678;
ss << number;

cout << "int to string" <<endl;
string convert_str;
ss >>  convert_str;

string numberStr = "654321";
int num=0;

ss << numberStr;
ss >> num;

cout << "str type:" << ss.str() <<endl; //印出stringstream中的字串
cout << "convert to num:" << num <<endl;

輸出的結果是:原先的字串仍在stringstream 中,並且也沒有寫入到num的資料non_clear

 

處理辦法

此時並不會是我們想要的結果,基本上需要很乾淨的處理掉,讓stringstream 重新使用,需要在使用前補上


ss.str("");
ss.clear();

str_and_clear

若是少了其中一個出來的結果都會不對

 

1.只使用str("")

使用str("")可以完全的把先前字串清空,但是若只有使用呼叫str("")仍然不能夠真的清理乾淨

因為這個時候stringstream的串流已經讀到尾端了(eof)

以上面的12345678範例來看,當我們對stringstream輸出到convert_str字串

ss >> convert_str

此時如同讀檔案一般,串流已經讀到結尾EOF,因此判定為error flag,所以即便清空字串,也無法再寫入到stringstream

原先: 12345678, EOF

                          ^

呼叫 ss.str(""): "",EOF

                           ^

如下程式便是只有使用ss.str("")的結果,當印出ss.str()結果時,卻發現沒有保存到寫入至stringstream中numberStr資料


// int to string

//….

//string to int

string numberStr = "654321";
int num=0;

ss.str(""); //只有清空字串
ss << numberStr;
ss >> num;

cout << "str type:" << ss.str() <<endl; //ss.str() 可以直接印出stringstream中的字串
cout << "convert to num:" << num <<endl;

only str

 

 

2.只使用ss.clear()

雖然可以繼續讀取string到stringstream串流字串,但是原先的資料仍會存在,並且很有趣的寫入num時不會有影響


// int to string

//….

//string to int

string numberStr = "654321";
int num=0;

ss.clear(); //只有清空flag
ss << numberStr;
ss >> num;

cout << "str type:" << ss.str() <<endl; //ss.str() 可以直接印出stringstream中的字串
cout << "convert to num:" << num <<endl;

only clear

原先: 12345678,EOF

呼叫ss.clear() :12345678,可繼續讀取

654321寫入至ss : 12345678654321,EOF

                                             ^

                                          紀錄從這邊是開始

 

所以如果要清空原先的stringstream時,要記得呼叫str("")與clear()

 

參考資料

C++ Reference

利用STL的stringstream來作數值與文字的轉換

stringstream 清空- 看板C_and_CPP - 批踢踢實業坊

請問 stringstream 要如何 reset?

 


 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)

另外要轉載請附上出處 感謝