iostream標准庫支持對於內存的輸入輸出,只要將流與存儲在程序內存中的string對象捆綁在一起,就可以使用通用的輸入輸出操作符來讀寫string對象!標准庫中定義了三種類型的字符串流:
istringstream,由istream派生出來的,用於讀一個string的對象;
ostringstream,由ostream派生出來的,用於寫一個string的對象;
stringstream,由iostream派生出來,同時提供了對於stringstream對象的功能!!
要是用上述的三個類,必須包含sstream頭文件!!
stringstream對象的一個重要的功能是讓我們更方便的操作string對象!請看下面這個例子:
1、可以在定義這個對象的時候進行初始化操作:
#include<sstream>
#include<string>
#include<iostream>
using namespace std;
int main()
{
string str;
int i = 12345;
stringstream ss;
ss << i;
str = ss.str();
return 0;
}
其中ss.str()返回的是一個流中保存的string對象的副本,這樣就實現了通過流對象對一個string對象的賦值操作
從而增加string對象操作的靈活性!
2、另外一個很重要的方面就是可以通過stringstream來實現數據類型的轉換將一個string對象中保存的字符串
還原成原來的數據結構!
#include<sstream>
#include<string>
#include<iostream>
using namespace std;
int main()
{
string str = “12345true”;
stringstream ss;
int i;
bool j;
ss.str(str);
ss >> i;
ss >> j;
cout << i <<endl;
cout << j <<endl;
return 0;
}
3、另外一個非常重要是將其作為一個socket通信中一個重要的載體來接收和存儲recv和send處理的數據!
這樣就可以直接作為boost序列化和反序列化的操作對象,來實現序列化和反序列化的操作!
while(true)
{
if((x = recv(int socket,char *buf, int len,0)) < 0)
{
sys_err("recv() error!!");
exit(-1);
}
else if(x > 0)//說明此處的數據尚未接收完畢,繼續往流對象中添加!!
{
ss << buf;
}
else
{
break;
}
}
boost::archive::text_iarchive ia(ss);
ia >> BOOST_SERIALIZATION_NVP(des);//這樣就可以直接將接受的數據對象進行反序列化操作,在
內存中進行,提高了速度!!這裡對於des目標類的序列化操作具體課參加這篇文中的內容!http://www.linuxidc.com/Linux/2012-08/69192.htm
send(int socket,char *buf,int len,0);
對於發送的操作同樣可以直接利用我們這裡stringstream對象:
boost::archive::text_oarchive oa(ss);
oa << BOOST_SERIALIZATION_NVP(des);通過這樣的方式將我們需要發送的數據結構寫入流對象!
send(socket,ss.str(),ss.str().size(),0);將流中存儲的序列化之後的字符串,直接發送出去,加快了速度!
關於stringstream對象的使用非常的靈活,在這裡把自己能想到的幾點記錄了下來,以供參考!