Solved

Clearing stringstream

Posted on 2001-08-06
11
883 Views
Last Modified: 2008-03-17
int main()
{
   string pnm;
   stringstream S;
   int x=123;
   int y=222;

   S << "xyz"  << x << "lpm" << y;
   
   pnm = S.str();
   cout << pnm << endl; // output should be xyz123lpm222

  // I would like to Clear 'S' - make it empty and reuse
  // to create another stream. (Modify its content)

   return 0;
}
0
Comment
Question by:prashant_n_mhatre
  • 4
  • 3
  • 3
  • +1
11 Comments
 
LVL 86

Expert Comment

by:jkr
ID: 6356883
I son't work a lot with stringstreams, but regarding the class hierarchy, calling 'S.flush()' should be enough...
0
 
LVL 4

Author Comment

by:prashant_n_mhatre
ID: 6356905
doesn't work...
0
 
LVL 4

Author Comment

by:prashant_n_mhatre
ID: 6356934
Thanks..I've figured out.

 S.seekp(0, ios::beg);

does that.
0
 
LVL 6

Expert Comment

by:Triskelion
ID: 6356964
Are you going to delete the question?
0
 
LVL 4

Author Comment

by:prashant_n_mhatre
ID: 6356973
Actually it will not work if I change the field length.
I need to add something like

freeze(false);

But that doesn't work with stringstream.
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 22

Accepted Solution

by:
nietod earned 50 total points
ID: 6356990
>> Thanks..I've figured out.
>> 
>> S.seekp(0, ios::beg);
>> 
>> does that.
Nope you didn't figure it out!  :-)

That makes a mess. (if you are not careful.

You need

stringstream S;
S.str(string());

or

S.str("");

continues
0
 
LVL 6

Expert Comment

by:Triskelion
ID: 6356992
Are you going to delete the question?
0
 
LVL 6

Expert Comment

by:Triskelion
ID: 6356999
That was an accident.
0
 
LVL 22

Expert Comment

by:nietod
ID: 6357028
EE is not working well right now!   I was tryign to post fo the longest time. Anyways to contineu--hopefully.

As I see you now realize, the problem with

   S.seekp(0, ios::beg);

is that it just moves the write position back to the start of the stream.  But the data already written stays there, so if you do.

   S <<"1234567890";
   S.seekp(0);
   S << "ABC";
   string AString = S.str();

This leaves AString with "ABC4567890" instead of just "ABC".

Now there is an expert who will tell you that the correct solution is to that the fix for this is

   S <<"1234567890";
   S.seekp(0);
   S << "ABC" << char(0);
   string AString = S.str();

But do not be fooled!  This just sticks a NUL terminator in the middle of the string data so that it appears like "ABC" is all that is stored.  its not.  it still stores the "567890" after that.  In fact the string's length() function will report this.   Don't fall for this!

Instead make use of the fact that you can store a new string data sequence in the stream object with the overlaoded str() member function.  i.e. you can do

   S.str("ABC");

and now the stream stores "ABC".  I you read from the stream you will read "ABC"  If you write to the stream you will wrote after the "ABC"  (unless you seek around.)  

In your case you want to set the stream to store an empty string, like

   S.str(string());

New the stream is empty.  It stores no data to read from the stream.  It stores no data that will be combined with data written to the stream.

Note that I am not sure how this operation effects the stram position.  You might still need to seek to the start of the stream after clearing its contents.
0
 
LVL 22

Expert Comment

by:nietod
ID: 6357040
Okay, you shouldn't need to do a seekp(0) or seekg(0).  The str(string) member function will reset the read and write positions to 0.
0
 
LVL 4

Author Comment

by:prashant_n_mhatre
ID: 6357077
Thanks all!!!
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In days of old, returning something by value from a function in C++ was necessarily avoided because it would, invariably, involve one or even two copies of the object being created and potentially costly calls to a copy-constructor and destructor. A…
Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

864 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now