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
网上,流传着几种办法,如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
相关文章推荐
- json字符串转换为JSONObject和JSONArray
- [网络]Unity的Socket通讯_2_数据传输
- Trump成功笔记4
- [Android] 点击listView的item无响应【解决办法】
- 图片懒加载
- Debian 用户名密码输入成功后重复登录
- C/C++代码中的笔误
- 第一阶段知识总结及问题反馈
- 外观模式
- BZOJ2725 : [Violet 6]故乡的梦
- 图片浏览器
- POJ 3349 Snowflake Snow Snowflakes(hash)
- UESTC 86 Divide (脑洞题+二进制)
- RTMP,RTSP,HLS比较与分析
- windows下主机名与IP地址的映射
- Trump成功笔记3
- (一)VBA基础——显示Excel的【开发工具】选项卡
- 适配器模式
- Dalvik VM (DVM) 与Java VM (JVM)之间有哪些区别?
- 数据库增删改查语句