stringstream中的clear()与str()

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

简化的代码如下:

#include <cstdlib>
#include <iostream>
#include <sstream> 

using namespace std; 

int main(int argc, char * argv[])
{
    stringstream stream;
    int a,b;

    stream<<"80";
    stream>>a;

    stream<<"90";
    stream>>b;

    cout<<a<<endl;
    cout<<b<<endl;

    system("PAUSE ");
    return  EXIT_SUCCESS;
} 

运行结果:

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

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

测试代码:

#include <cstdlib>
#include <iostream>
#include <sstream> 

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<<a<<endl;
    cout<<b<<endl;

    system("PAUSE ");
    return  EXIT_SUCCESS;
} 

运行结果:

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

但是,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 <cstdlib>
#include <iostream>
#include <sstream> 

using namespace std; 

int main(int argc, char * argv[])
{
    stringstream stream;
    int a,b;

    stream<<"80";
    stream>>a;

    stream.clear();

    cout<<"Size of stream = "<<stream.str().length()<<endl;

    stream<<"90";
    stream>>b;

    cout<<"Size of stream = "<<stream.str().length()<<endl;

    cout<<a<<endl;
    cout<<b<<endl;

    system("PAUSE ");
    return  EXIT_SUCCESS;
} 

运行结果:

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 rdbuf()->str(). Notice that setting a new string does not clear the error flags currently set in the stream object unless the member function clearis explicitly called.

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

测试代码:

#include <cstdlib>
#include <iostream>
#include <sstream> 

using namespace std; 

int main(int argc, char * argv[])
{
    stringstream stream;
    int a,b;

    stream<<"80";
    stream>>a;
    cout<<"Size of stream = "<<stream.str().length()<<endl;

    stream.clear();
    stream.str("");

    cout<<"Size of stream = "<<stream.str().length()<<endl;

    stream<<"90";
    stream>>b;

    cout<<"Size of stream = "<<stream.str().length()<<endl;

    cout<<a<<endl;
    cout<<b<<endl;

    system("PAUSE ");
    return  EXIT_SUCCESS;
} 

运行结果:

  

总结一下吧,

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

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

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

stringstream中的clear()与str()

时间: 2024-12-24 05:00:08

stringstream中的clear()与str()的相关文章

stringstream中的.clear()和.str()

在C++中可以使用stringstream来很方便的进行类型转换,字符串串接,不过注意重复使用同一个stringstream对象时要先继续清空,而清空很容易想到是clear方法,而在stringstream中这个方法实际上是清空stringstream的状态(比如出错等),真正清空内容需要使用.str("")方法. 用.str("")方法可以清楚缓存,但是,需要重复使用同一个stringstream对象时,得先用.str("")方法清楚缓存,再用

C++中cin.clear()的用法

我们谈谈cin.clear的作用,第一次看到这东西,很多人以为就是清空cin里面的数据流,而实际上却与此相差很远,首先我们看看以下代码: #include <iostream>  using namespace std;  int main()   {              int a;              cin>>a;              cout<<cin.rdstate()<<endl;              if(cin.rds

istringstream字符串流,实现类似字符串截取的功能,字符串流中的put,str()将流转换成为字符串string

 1. istringstream字符串流 #include <iostream> #include <sstream> #include <string> using namespace std; struct MyStruct { string str1, str2, str3; double db; int num; char ch; }; void main() { string  mystring("china  google microsoft

vector 中的clear()

为什么clear之后,还是输出fdsafdsa.有什么办法可以真正清空之? 因为对于vector,clear并不真正释放内存(这是为优化效率所做的事),clear实际所做的是为vector中所保存的所有对象调用析构函数(如果有的话),然后初始化size这些东西,让你觉得把所有的对象清除了... 真正释放内存是在vector的析构函数里进行的,所以一旦超出vector的作用域(如函数返回),首先它所保存的所有对象会被析构,然后会调用allocator中的deallocate函数回收对象本身的内存.

css中的clear:both,display:flex;

介绍两者一起讨论的原因: 在明天就国庆的日子里陪着程序员的只有代码,啤酒,还有音乐,然后就是灯光下默默陪伴自己的影子.好了,不矫情了. ----------------------------------------------------------- 先上两张图,然后慢慢道来...... 第一张是实现的布局,第二张是布局的代码.简单的说明一下:图一中有4块为classname为newsItem的div容器(代码有点乱看起来有点吃力),这4个容器包含在classname为newsRow的sec

c++中while(cin&gt;&gt;str)和ctrl z的相关问题探讨

对于while (cin>>str)和ctrl z的问题,网上有以下解释: ------------------------------------------------------------------------------------------------------------------------------ 输入(cin)缓冲是行缓冲.当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储.每当按下回车键后,cin就会检测输入缓冲区中是否有了可读的数据. c

delphi 中TStringList Clear 方法的时候该对象有没有被释放

delphi 中TStringList 通过function AddObject(const S: string; AObject: TObject): Integer; 方法添加了一个对象,请问我在调用Clear 方法的时候该对象有没有被释放 object里存的只是指向对象的指针,clear只是把指针清除了,对象并没有被释放.TObjectList可以自动释放对象,剩下的TList,StringList等List类型的都需要手动释放.

jsp中利用response.senddirect(str)重定向,传递参数新思路

用Servlet进行请求重定向,参数传递好办,直接用request.setAttribute(str1,str2); 但是如果不用Servlet 而是直接用jsp进行转发呢? 我们首先要知道   请求的重定向:在最终的Servlet中,request对象和中转的那个request不是同一个对象 所以传递参数,自然就获取不到了 下面我们换思路,另辟蹊径,我们用session  session的生命周期长啊 所以完全可以获取 至于session与request的知识,请查阅相关资料 下面贴出登录出现

C#的cs文件中Response.Clear();Response.ClearHeaders()的作用

在学习一个CS文件,如下:public partial class GetPic : System.Web.UI.Page{    protected void Page_Load(object sender, EventArgs e)    {        string picid = Request.QueryString["id"];        string pictureFilename = Path.Combine(Server.MapPath("/produ