C++/C--istringstream、ostringstream、stringstream 類介紹【轉載】

1 C++的輸入輸出分爲三種:

1.1 基於控制檯的I/O

頭文件類型
iostream istream從中讀取
ostream寫到中去
iostream對進行讀寫,從istream和ostream派生

1.2 基於文件的I/O

頭文件類型
fstream ifstream從文件中讀取,由istream派生
ofstream寫到文件中去,由ostream派生
iostream對文件進行讀寫,從iostream派生

1.3 基於字符串的I/O

頭文件類型
sstream istringstream從string對象中讀取,由istream派生
ostringstream寫到string對象中去,由ostream派生
stringstream對string對象進行讀寫,從iostream派生

2 頭文件

#include <sstream>  

3 功能

  • istringstream類用於執行C++風格的字符串流的輸入操作。
  • ostringstream類用於執行C++風格的字符串流的輸出操作。
  • strstream類同時可以支持C++風格的串流的輸入輸出操作。

4 具體分析

4.1 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(int argc,char* argv[])  
{  
    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   
    ////測試輸出   
    //cout<<d<<endl;  
    //cout<<n<<endl; 
  
    //假設換下存儲類型   
    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(int argc,char* argv[])  
{  
    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;  
}  

運行結果:
在這裏插入圖片描述

4.2 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;  
}  

運行結果:
在這裏插入圖片描述

4.3 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(),則根本就起不到任何作用。


以上內容來自:

  1. 冷夜 - 網遊編程技術_istringstream、ostringstream、stringstream 類介紹 .【CNBLOGS】
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章