C++標準庫中的<sstream>提供了比ANSI C的<stdio.h>更高級的一些功能,即單純性、類型安全和可擴展性。html
若是你已習慣了<stdio.h>風格的轉換,也許你首先會問:爲何要花額外的精力來學習基於<sstream>的類型轉換呢?也許對下面一個簡單的例子的回顧可以說服你。假設你想用sprintf()函數將一個變量從int類型轉換到字符串類型。爲了正確地完成這個任務,你必須確保證目標緩衝區有足夠大空間以容納轉換完的字符串。此外,還必須使用正確的格式化符。若是使用了不正確的格式化符,會致使非預知的後果。下面是一個例子:程序員
int n=10000; chars[10]; sprintf(s,」%d」,n); // s中的內容爲「10000」
到目前爲止看起來還不錯。可是,對上面代碼的一個微小的改變就會使程序崩潰:
int n=10000; char s[10]; sprintf(s,」%f」,n); // 看!錯誤的格式化符
在這種狀況下,程序員錯誤地使用了%f格式化符來替代了%d。所以,s在調用完sprintf()後包含了一個不肯定的字符串。要是能自動推導出正確的類型,那不是更好嗎?數組
進入stringstream
因爲n和s的類型在編譯期就肯定了,因此編譯器擁有足夠的信息來判斷須要哪些轉換。<sstream>庫中聲明的標準類就利用了這一點,自動選擇所必需的轉換。並且,轉換結果保存在stringstream對象的內部緩衝中。你沒必要擔憂緩衝區溢出,由於這些對象會根據須要自動分配存儲空間。安全
<sstream>庫定義了三種類:istringstream、ostringstream和stringstream,分別用來進行流的輸入、輸出和輸入輸出操做。另外,每一個類都有一個對應的寬字符集版本。簡單起見,我主要以stringstream爲中心,由於每一個轉換都要涉及到輸入和輸出操做。
注意,<sstream>使用string對象來代替字符數組。這樣能夠避免緩衝區溢出的危險。並且,傳入參數和目標對象的類型被自動推導出來,即便使用了不正確的格式化符也沒有危險。
string到int的轉換
函數
string result=」10000」; int n=0; stream<<result; stream>>n; //n等於10000
重複利用stringstream對象學習
若是你打算在屢次轉換中使用同一個stringstream對象,記住再每次轉換前要使用clear()方法;spa
在屢次轉換中重複使用同一個stringstream(而不是每次都建立一個新的對象)對象最大的好處在於效率。stringstream對象的構造和析構函數一般是很是耗費CPU時間的。code
.clear()是清空標誌位
.str() 是清內容htm
istringstream對象
istringstream是由一個string對象構造而來,istringstream類從一個string對象讀取字符。
(a) istringstream istr;
istr.str("1 56.7",);
(b) 上述兩個過程能夠簡單寫成 istringstream istr("1 56.7");
ostringstream 是向一個string對象輸出字符
ostringstream ostr;
a. 得到字符串 .str();
b. 每次不一樣的使用時刻必需要清空 ss.str(""), iss.str(""), oss.str(""),暫時沒有發現其它的清空方法
字符串的分割/Split函數的簡單實現
stringstream的另外一個用途是進行字符串的分割。在std::string中沒有實現split函數(Java中的string實現了split函數,使得使用很是方便)。爲此能夠使用stringstream進行字符串的分割,以下所示:
std::string str_temp = "hello world !"; std::stringstream stream1(str_temp); while(stream1 >> str_temp){ printf("%s\n",str_temp.c_str()); }
便可將字符串進行分割。上述的stringstream能夠用istringstream代替。
部份內容節選自 http://www.cnblogs.com/yaozhongxiao/archive/2009/05/23/1487903.html
(完)