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 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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top