• std::stringstream(2)


    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<<'	'<<c;
    运行的时候,输入 -() 然后回车,输出结果是:
    0       (
    问题就出现了,既然cin>>d,产生了错误,为什么它不把已经读入的全部字符退回输入流呢?
    结果导致cin>>c的时候,得到的却是'('
    这个问题就是以前那个四则运算的模板代码的BUG,对于1+-(2)的式子,'-'号被忽略,而不是报为错误。
    晚点,我会把我的新整理的四则运算模板代码发布在本Blog
  • 相关阅读:
    写作的益处
    【转载】德鲁克:激发我一生的七段经历
    PS如何删除灰色的自动切片
    其他经验博文分类链接
    LODOP单个简短问答(小页面无需拖动滚动条)
    LODOP导出excel的页眉页脚
    LODOP导出和写入excel测试
    LODOP导出Excel简短问答和相关博文
    Lodop导出excel带数字格式
    LODOP批量打印判断是否加入队列1
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/3721485.html
Copyright © 2020-2023  润新知