【问题标题】:CRLF end of line and ostringstreamCRLF 行尾和 ostringstream
【发布时间】:2011-07-25 02:17:40
【问题描述】:

我正在尝试使用 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::ifstreamstd::string,您希望CRLF 被转换为内部表示。所以每个人都希望std::string 在任何时候都包含内部文本表示。

标签: c++ newline ostringstream


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    我不知道你为什么在内部字符串中需要除 "\n" 之外的任何内容, 但这并不难:只要定义

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

    然后输出。

    【讨论】:

    • 我希望它也能够在不创建文件的情况下执行转换。好吧,我想我会简单地在我的函数中添加一个换行参数,谢谢大家。
    猜你喜欢
    • 2020-10-16
    • 2021-09-06
    • 2019-10-24
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    相关资源
    最近更新 更多