I am trying to use a ostringstream to build a string which uses the platform standard line endings (so for me it is CRLF since I am developing for Windows). I tried the following code:
std::ostringstream out;
out << "line1\nline2\n";
const char* result = out.str().c_str(); // In result end of lines are '\n' instead
// of the expected '\r\n'
Since ostringstream is opened by default in text mode, I thought it would perform the end of line conversion (like an ofstream) but the resulting char buffer does not contain the expected CRLF end of lines....
Edit:
For those who wondered why I needed the CRLF ending internally: I 开发者_StackOverflow社区copy the text into the Windows clipboard and user often copy that content to Notepad and without the CRLF ending the end of lines are lost during that last operation....
My solution:
Finally I decided to use the boost library to replace \n with \r\n:
boost::replace_all( str, "\n", "\r\n" );
Well, '\n' is the internal representation for end-of-line.
It is just when you write to an external file that it is converted (if needed!) to the external representation. On some systems the line ending is just one character, or even no character at all if stored with a hidden length value instead.
The distinction text mode/binary mode is purely std::filebuf. It's not relevant elsewhere.
I'm not sure why you would want anything but "\n" in an internal string, but it's not difficult: just define
char const newline[] = "\x0D\x0A"; // Or whatever the convention is
and output that.
精彩评论