CRLF行尾和ostringstream

时间:2011-03-29 08:27:07

标签: c++ newline ostringstream

我正在尝试使用ostringstream来构建一个使用平台标准行结尾的字符串(因此对我来说,它是CRLF,因为我正在为Windows开发)。我尝试了以下代码:

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'

由于默认情况下在文本模式下打开ostringstream,我认为它会执行行结束转换(如ofstream),但生成的char缓冲区不包含预期的CRLF行结束....

编辑:

对于那些想知道为什么我需要CRLF内部结束的人:我将文本复制到Windows剪贴板中,用户经常将该内容复制到记事本,如果没有CRLF结束,则在最后一次操作期间行的末尾会丢失....

我的解决方案:

最后我决定使用boost库将\ n替换为\ r \ n:

boost::replace_all( str, "\n", "\r\n" );

2 个答案:

答案 0 :(得分:2)

嗯,'\ n' 是行尾的内部表示。

当您写入外部文件时,它就会被转换(如果需要!)到外部表示。在某些系统上,行结尾只是一个字符,如果存储的是隐藏长度值,则根本就没有字符。

答案 1 :(得分:1)

区别文本模式/二进制模式纯粹是std :: filebuf。不是 相关的其他地方。

我不确定你为什么在内部字符串中只需要“\ n”, 但这并不困难:只需定义

char const newline[] = "\x0D\x0A";  //  Or whatever the convention is

并输出。