istringstream、ostringstream、stringstream 類介紹

轉載自:http://www.cnblogs.com/gamesky/archive/2013/01/09/2852356.html

關於istringstream、ostringstream、stringstream 類介紹 ,這篇文章寫得比較好,

0、C++的輸入輸出分爲三種:

(1)基於控制檯的I/O

   

(2)基於文件的I/O

        

(3)基於字符串的I/O

         

1、頭文件

[cpp] view plaincopyprint?

#include <sstream>

2、作用

istringstream類用於執行C++風格的字符串流的輸入操作。 

ostringstream類用於執行C++風格的字符串流的輸出操作。 

strstream類同時可以支持C++風格的串流的輸入輸出操作。

3、具體分析

istringstream類

描述:從流中提取數據,支持 >> 操作

這裏字符串可以包括多個單詞,單詞之間使用空格分開

istringstream的構造函數原形:  
istringstream::istringstream(string str); 


初始化:使用字符串進行初始化

istringstream istr("1 56.7");  
istr.str("1 56.7");//把字符串"1 56.7"存入字符串流中

使用:我們可以使用分解點獲取不同的數據,完成 字符串 到 其他類型 的轉換

常用成員函數:

 

str():使istringstream對象返回一個string字符串  

舉例:把字符串類型的數據轉換爲其他類型

 

    #include <iostream>   
    #include <sstream>   
    using namespace std;  
    int main()  
    {  
        istringstream istr("1 56.7");  
      
        cout<<istr.str()<<endl;//直接輸出字符串的數據 "1 56.7"   
          
        string str = istr.str();//函數str()返回一個字符串   
        cout<<str<<endl;  
          
        int n;  
        double d;  
      
        //以空格爲界,把istringstream中數據取出,應進行類型轉換   
        istr>>n;//第一個數爲整型數據,輸出1   
        istr>>d;//第二個數位浮點數,輸出56.7   
      
        //假設換下存儲類型   
        istr>>d;//istringstream第一個數要自動變成浮點型,輸出仍爲1   
        istr>>n;//istringstream第二個數要自動變成整型,有數字的階段,輸出爲56   
      
        //測試輸出   
        cout<<d<<endl;  
        cout<<n<<endl;  
        system("pause");  
        return 1;  
    }  

舉例2:把一行字符串放入流中,單詞以空格隔開。之後把一個個單詞從流中依次讀取到字符串

    #include <iostream>   
    #include <sstream>   
    using namespace std;  
    int main()  
    {  
        istringstream istr;  
        string line,str;  
        while (getline(cin,line))//從終端接收一行字符串,並放入字符串line中   
        {  
            istr.str(line);//把line中的字符串存入字符串流中   
            while(istr >> str)//每次讀取一個單詞(以空格爲界),存入str中   
            {  
                cout<<str<<endl;  
            }  
        }  
        system("pause");  
        return 1;  
    } 


輸入:123 34 45

輸出:

123  換行 34 換行 45

ostringstream類

描述:把其他類型的數據寫入流(往流中寫入數據),支持<<操作

ostringstream的構造函數原形:  
ostringstream::ostringstream(string str); 


初始化:使用字符串進行初始化

ostringstream ostr("1234");  
ostr.str("1234");//把字符串"1234"存入字符串流中  


舉例:

    #include <iostream>   
    #include <sstream>   
    using namespace std;  
    int main()  
    {  
        //初始化輸出字符串流ostr   
        ostringstream ostr("1234");  
        cout<<ostr.str()<<endl;//輸出1234   
          
        ostr.put('5');//字符4頂替了1的位置   
        cout<<ostr.str()<<endl;//輸出5234   
      
        ostr<<"67";//字符串67替代了23的位置,輸出5674   
        string str = ostr.str();  
        cout<<str<<endl;  
        system("pause");  
        return 1;  
    }


stringstream類

描述:是對istringstream和ostringstream類的綜合,支持<<, >>操作符,可以進行字符串到其它類型的快速轉換

    stringstream的構造函數原形如下:  
    stringstream::stringstream(string str);  

初始化:使用字符串進行初始化

stringstream str("1234");  
str.str("1234");//把字符串"1234"存入字符串流中

作用:

1、stringstream通常是用來做數據轉換的

2、將文件的所有數據一次性讀入內存

舉例1:基本數據類型變字符串

    /*基本數據類型變字符串*/  
    #include <fstream>   
    #include <iostream>   
    #include <sstream>   
    using namespace std;  
    int main()  
    {  
        /*整型變字符串*/  
        int n = 10;  
        string str;  
        stringstream stream;  
          
        stream << n;  
        stream >> str;  
          
        cout<<str<<endl;  
        stream.clear();//多次使用stringstream,要先清空下,不能使用stream.str("");否則下面輸出10   
      
        /*char* 變 string*/  
        char cStr[10] = "china";  
          
        stream << cStr;  
        stream >> str;  
      
        cout<<str<<endl;  
        system("pause");  
        return 1;  
    }  


舉例2:字符串變基本數據類型

    /*字符串變基本數據類型*/  
    #include <fstream>   
    #include <iostream>   
    #include <sstream>   
    using namespace std;  
    int main()  
    {  
        /*字符串 變 double*/  
        double n;  
        string str = "12.5";  
        stringstream stream;  
          
        stream << str;  
        stream >> n;  
          
        cout<<n<<endl;  
        stream.clear();//多次使用stringstream,要先清空下,不能使用stream.str("");   
      
        /*string 變 char* */  
        string str1 = "china";  
        char cStr[10];  
          
        stream << str1;  
        stream >> cStr;  
      
        cout<<cStr<<endl;//輸出china   
        system("pause");  
        return 1;  
    } 


 注意:
#include <iostream>   
#include <sstream>   
using namespace std;   
int main(int argc,char *argv[])  
{  
    std::stringstream stream;  
    string str;  
    while(1)  
    {     
        //clear(),這個名字讓很多人想當然地認爲它會清除流的內容。   
        //實際上,它並不清空任何內容,它只是重置了流的狀態標誌而已!   
        stream.clear();    
  
        // 去掉下面這行註釋,清空stringstream的緩衝,每次循環內存消耗將不再增加!   
        //stream.str("");         
  
        stream<<"sdfsdfdsfsadfsdafsdfsdgsdgsdgsadgdsgsdagasdgsdagsadgsdgsgdsagsadgs";  
        stream>>str;     
  
        //測試輸出每次循環,你的內存消耗增加了多少!   
        cout<<"Size of stream = "<<stream.str().length()<<endl;  
        system("PAUSE");  
    }  
  
    system("PAUSE");  
    return EXIT_SUCCESS;  
}



由於stringstream構造函數會特別消耗內存,似乎不打算主動釋放內存(或許是爲了提高效率),但如果你要在程序中用同一個流,反覆讀寫大量的數據,將會造成大量的內存消耗,因些這時候,需要適時地清除一下緩衝 (用 stream.str("") )。另外不要企圖用 stream.str().resize(0),或 stream.str().clear() 來清除緩衝,使用它們似乎可以讓stringstream的內存消耗不要增長得那麼快,但仍然不能達到清除stringstream緩衝的效果,內存的消耗還在緩慢的增長!,至於stream.flush(),則根本就起不到任何作用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章