[C++] StringStream-int和sting轉換的另一種方案與清空StringStream
StringStream可以來做int與String類別的之間的轉換,記錄一下轉換的過程與如果要繼續使用StringStream時的清空資料的方式
前言
今天上課偶然第一次看到StringStream這個類別,於是筆記一下比較常用來做的部分
StringStream 是一個專門用來處理讀取或寫入到String的類別。
透過StringStream 可以幫我做們做字串的處理
不過,最常見的使用方法是拿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;
string字串數字轉int
stringstream ss;
string numberStr = "654321";
int num;
ss << numberStr;
ss >> num;
cout << "str type:" << numberStr <<endl;
cout << "convert to num:" << num <<endl;
檢查有無轉型成功與其他型態的轉型例子
上述除了做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的資料
處理辦法
此時並不會是我們想要的結果,基本上需要很乾淨的處理掉,讓stringstream 重新使用,需要在使用前補上
ss.str("");
ss.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;
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;
原先: 12345678,EOF
呼叫ss.clear() :12345678,可繼續讀取
654321寫入至ss : 12345678654321,EOF
^
紀錄從這邊是開始
所以如果要清空原先的stringstream時,要記得呼叫str("")與clear()
參考資料
stringstream 清空- 看板C_and_CPP - 批踢踢實業坊
文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)
另外要轉載請附上出處 感謝