CRLF行尾符和ostringstream

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" );

这是正确的。std::ostringstream使用内部文本字符串表示。CRLF用于磁盘上的文本表示。如果您将std::ifstream读取为std::string,则期望将CRLF转换为内部表示。因此,每个人都期望std::string在任何时刻都包含内部文本表示。 - Serge Dundich
只是为了完成上述解决方案,针对您已经混合使用了行尾符的情况: boost::replace_all( str, "\n", "\r\n" ); boost::replace_all( str, "\r\n\n", "\r\n" ); - Frank Heimes
2个回答

2

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

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


1

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

我不确定为什么您希望在内部字符串中使用除 "\n" 以外的任何内容,但这并不难:只需定义即可。

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

并输出它。


我希望它也能够在不创建文件的情况下执行转换。好吧,我猜我只需要向我的函数添加一个新行参数,感谢大家。 - JMD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接