使用stringstream進行類型轉換與字符串分割


C++標准庫中的<sstream>提供了比ANSI C的<stdio.h>更高級的一些功能,即單純性、類型安全和可擴展性。

如果你已習慣了<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
由於ns的類型在編譯期就確定了,所以編譯器擁有足夠的信息來判斷需要哪些轉換。<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()方法;

在多次轉換中重復使用同一個stringstream(而不是每次都創建一個新的對象)對象最大的好處在於效率。stringstream對象的構造和析構函數通常是非常耗費CPU時間的。

.clear()是清空標志位 
.str() 是清內容

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


(完)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM