您的位置:首页 > 其它

stringstream的复制

2015-10-08 00:20 309 查看
原文地址:stringstream的复制作者:女孩stringstream本身的复制构造函数是私有的,无法直接用,于是带来了一些复杂的问题

网上,流传着几种办法,如streamA.str(streamB.str()),但这种办法,复制的仅仅是初始化时的string

会在以下这种情况下暴露出问题:

   
stringstream s1("123aaa");

    string
s;

    int a;

   
s1>>a;

    stringstream
s2;

   
s2.str(s1.str());// <-----就是这句

   
s1>>s;

   
cout<<"s1="<<s<<endl;

   
s2>>s;

   
cout<<"s2="<<s<<endl;

又有人说,用 s2 << s1.rdbuf();
代替原来那句,但后果是s1的内容被清掉了。

网上找不到有关的资料,本人也对stream不熟悉。

后来在ning的帮助下,终于了解到还需要把输入输出指针位置进行复制。

经过完善后,整理出复制流的模板函数:

template <class _tStream>

_tStream& CopyStream(_tStream &s,
_tStream& a)

{

    s.clear();
a.clear(); s.str(a.str());

   
s.seekg(a.tellg()); s.seekp(a.tellp());

    return
s;

}

当然,如果你想要方便一些,你可以改成operator=

clear()的调用是必须的,否则如果流在错误状态下是复制不成功的。

当然,这个所谓的复制,仅仅是内容上的复制,状态却被重置了,不能算完美复制,

如果还有这个层次上的需要,那么在复制前还要把要复制的流的状态给保存下来,复制后还原,比较麻烦。

 

再附另一个流问题,就是因为这个问题才发现前面的情况的:

使用以下代码:

    double
d=0;

    char
c=0;

   
cin>>d;

   
cin.clear();

   
cin>>c;

   
cout<<d<<'t'<<c;

运行的时候,输入 -() 然后回车,输出结果是:

0      
(

问题就出现了,既然cin>>d,产生了错误,为什么它不把已经读入的全部字符退回输入流呢?

结果导致cin>>c的时候,得到的却是'('

这个问题就是以前那个四则运算的模板代码的BUG,对于1+-(2)的式子,'-'号被忽略,而不是报为错误。

晚点,我会把我的新整理的四则运算模板代码发布在本Blog
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: