stringstream的复制

原文地址: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;
运行的时候,输入 -() 然后回车,输出结果是:

      (

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

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

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

晚点,我会把我的新整理的四则运算模板代码发布在本Blog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值