博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
stringstream中的clear()与str()
阅读量:5750 次
发布时间:2019-06-18

本文共 2700 字,大约阅读时间需要 9 分钟。

 

  今天在用stringstream做数据转换的时候,遇到了问题,发现得到的不是预期的结果。

简化的代码如下:

 

#include 
#include
#include
using namespace std; int main(int argc, char * argv[]){ stringstream stream; int a,b; stream<<"80"; stream>>a; stream<<"90"; stream>>b; cout<
<

 运行结果:

   int变量b预期的到的结果应该是90,但是程序运行的结果却是-858993460这样一个数据,显然是哪里错了。

于是,google一番之后,原因是,stringstream重复使用时,因为没有清空导致的问题。看到一种解决方案:再次使用前,使用stringstream.clear()清空。

测试代码:

#include 
#include
#include
using namespace std; int main(int argc, char * argv[]){ stringstream stream; int a,b; stream<<"80"; stream>>a; stream.clear();// stream<<"90"; stream>>b; cout<
<

运行结果:

 果然,我们得到预期的结果了。

但是,stringstream.clear()是什么呢?

void clear ( iostate state = goodbit );

Set error state flags
Sets a new value for the error control state.
All the bits in the control state are replaced by the new ones; The value existing before the call has no effect.
If the function is called with goodbit as argument (which is the default value) all error flags are cleared.
The current state can be obtained with member function rdstate.

 clear清空的的标志位!!看下面代码运行的结果:

#include 
#include
#include
using namespace std; int main(int argc, char * argv[]){ stringstream stream; int a,b; stream<<"80"; stream>>a; stream.clear(); cout<<"Size of stream = "<
<
>b; cout<<"Size of stream = "<
<

运行结果:

 clear()之后,虽然结果正确了,但是stream占用的内存却没有释放!!!在我们的小测试中虽然不会有什么问题,但是在实际的应用中,要是多次使用stringstream,每次都增加占用的内存,那么显然是会有问题的!!!

继续google之后,stringstream.str()出现了。

void str ( const string & s );   // copies the content of string s to the string object associated with the string stream buffer. The function effectivelly calls ()->(). Notice that setting a new string does not clear the error flags currently set in the stream object unless the member function is explicitly called.

 可以利用stringstream.str("")来清空stringstream。

测试代码:

#include 
#include
#include
using namespace std; int main(int argc, char * argv[]){ stringstream stream; int a,b; stream<<"80"; stream>>a; cout<<"Size of stream = "<
<
>b; cout<<"Size of stream = "<
<

 

运行结果:

   

总结一下吧,

void clear ( iostate state = goodbit );//该方法绝非清空stringstream中的内容,而是清空该流的错误标记!

void str ( const string & s );//该方法是重新给stringstream赋新值的意思。

 

于是,我们轻松愉快的解决了问题,么么哒。

转载于:https://www.cnblogs.com/qingsiburan/p/3858680.html

你可能感兴趣的文章
如何成为一个C++高级程序员
查看>>
iptables 生产环境配置
查看>>
ant android 打包签名和渠道
查看>>
Lua中的全局变量与环境
查看>>
linux命令学习(1)-awk
查看>>
ActionBar中SearchView创建的2种方式
查看>>
一个简单的接口,被调用并同步给出响应的方法
查看>>
rhel7.2使用lvm安装虚拟机
查看>>
公司网络很慢很卡的原因分析与处理
查看>>
Hadoop序列化与压缩
查看>>
由“男怕入错行”说开去
查看>>
php-fpm多实例运行
查看>>
MySQL数据库安装
查看>>
CGImageSource对图像数据读取任务的抽象
查看>>
我的友情链接
查看>>
xss test
查看>>
也谈svn分支与合并
查看>>
显式锁(第十三章)
查看>>
微软超融合私有云测试29-SCDPM2016部署之创建保护组备份(备份虚拟机)
查看>>
LBS“他爹”GIS
查看>>