5

我正在尝试使用 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" );
4

2 回答 2

2

好吧,'\n'行尾的内部表示。

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

于 2011-03-29T08:31:55.673 回答
1

区分文本模式/二进制模式纯粹是 std::filebuf。这与其他地方无关。

我不知道为什么你会想要一个内部字符串中除了 "\n" 之外的任何东西,但这并不难:只需定义

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

并输出。

于 2011-03-29T08:31:16.627 回答