Alexandre Toqué
Alexandre Toqué

Reputation: 193

Stringstream don't copy new lines

Special characters disappear when I pass a string into a stringstream. I tried this code which can directly be tested:

#include <iostream>
#include <sstream>
using namespace std;

int main(int argc, char* argv[]) {

 string txt("hehehaha\n\t hehe\n\n<New>\n\ttest:\t130\n\ttest_end:\n<New_end>\n");

 cout << txt << endl; // No problem with new lines and tabs

 stringstream stream;
 stream << txt;
 string s;
 while(stream >> s) {
  cout << s;  // Here special characters like '\n' and '\t' don't exist anymore.
 }
 cout << "\n\n";

 return 0;
}

What can I do to overcome this?

Edit: I tried this:

stream << txt.c_str();

and it worked. But I don't know why...

Upvotes: 3

Views: 4428

Answers (2)

Stefano Falasca
Stefano Falasca

Reputation: 9097

basically, you are just printing it wrong, it should be:

cout << stream.str() << endl;

Some details. You are calling operator<<(string) which

overloads operator<< to behave as described in ostream::operator<< for c-strings

The referred to behaviour is explained here:

(2) character sequence Inserts the C-string s into os. The terminating null character is not inserted into os. The length of the c-string is determined beforehand (as if calling strlen).

Strlen documentation says that the result is affected by nothing but

the terminating null-character

Indeed, strlen(tmp) in your examples outputs 55.

The stream, hence, gets "assigned" everything which comes up to the 55th character in your input string.

cout << stream.str() << endl;

will show you that this is indeed what happens.

A parenthesis: you can modify the behaviour of the stream << txt line by means of setting/unsetting flags, as in

 stream.unsetf ( std::ios::skipws );

which you should try out.

Upvotes: 2

Patrik Beck
Patrik Beck

Reputation: 2505

The statement

while(stream >> s)

Is the problem, it gives you one token on each call, using white spaces for splitting and therefor ignoring them.

Upvotes: 0

Related Questions