iostream标准库支持对于内存的输入输出,只要将流与存储在程序内存中的string对象捆绑在一起,就可以使用通用的输入输出操作符来读写string对象!标准库中定义了三种类型的字符串流:
istringstream,由istream派生出来的,用于读一个string的对象;
ostringstream,由ostream派生出来的,用于写一个string的对象;
stringstream,由iostream派生出来,同时提供了对于stringstream对象的功能!!
要是用上述的三个类,必须包含sstream头文件!!
stringstream对象的一个重要的功能是让我们更方便的操作string对象!请看下面这个例子:
1、可以在定义这个对象的时候进行初始化操作:
#include
#include
#include
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
#include
#include
using namespace std;
int main()
{
string str = “12345true”;
stringstream ss;
int i;
bool j;
ss.str(str);
ss >> i;
ss >> j;
cout << i < cout << j <
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目标类的序列化操作具体课参加上一篇博文中的内容!
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对象的使用非常的灵活,在这里把自己能想到的几点记录了下来,以供参考!
阅读(3882) | 评论(0) | 转发(0) |