浅谈C++中stringstream对象


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目标类的序列化操作具体课参加这篇文中的内容!
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对象的使用非常的灵活,在这里把自己能想到的几点记录了下来,以供参考!

相关内容