How to clear out a stringstream in C++? Options

codeling Posts: 1153 Points: 4845
Posted: Thursday, June 6, 2019 8:49:08 AM

If you try the following C++ snippet:

std::stringstream ss;
std::string str1, str2;
float f1 = 10.0;
float f2 = 20.0;

ss << f1;
ss >> str1;

ss.str("");

ss << f2;
ss >> str2;

you'll find that str2 is empty.

ss.str("") clears the stream but when you try to add a new value to the stream, it somehow doesnt get updated. therefore, you have to add a clear() statement just before or after str("") like the following...

ss.clear();
ss.str("");

or

ss.str("");
ss.clear();

this not only clears the stream but also allows you to add a new value to it.


codeling Posts: 1153 Points: 4845
Posted: Thursday, June 6, 2019 9:05:16 AM

The function str() can be used in two ways. First, it can be used to get a copy of the string that is being manipulated by the current stream string. This is most useful with output strings. For example:

  ostringstream stream1;
  stream1 << "Testing!" << endl;
  cout << stream1.str();

Second, str() can be used to copy a string into the stream. This is most useful with input strings. For example:

  istringstream stream1;
  string string1 = "25";
  stream1.str(string1);

str(), along with clear(), is also handy when you need to clear the stream so that it can be reused:

  istringstream stream1;
  float num;

  // use it once
  string string1 = "25 1 3.235\n1111111\n222222";
  stream1.str(string1);
  while( stream1 >> num ) cout << "num: " << num << endl;  // displays numbers, one per line

  // use the same string stream again with clear() and str()
  string string2 = "1 2 3 4 5  6 7 8 9 10";
  stream1.clear();
  stream1.str(string2);

  while( stream1 >> num ) cout << "num: " << num << endl;  // displays numbers, one per line

codeling Posts: 1153 Points: 4845
Posted: Thursday, June 6, 2019 9:22:23 AM

Try to the following C++ code to learn the usage of clear() and str():

    string test;
    string test2;
    stringstream ss;

    for(int j=0;j<10;j++)
    {
        ss.clear();
        //ss.str("");
        ss<<j;
        test = ss.str();
        ss>>test2;
        cout <<test<<" "<<ss.str()<<" "<<test2<<endl;
    }
 

use ss.clear() only:

Use str("") only:

use clear() and str(""):

 

Users browsing this topic
Guest