我正在使用 向 std::stringstream 添加一些行stream << "content" << std::endl。然后我通过 获取内容stream.str()。如果将 添加std::endl到 中,std::stringstream这将用作\n行结尾。

如果添加了,是否可以强制std::stringstream使用特定的行结尾"\r\n"std::endl

(我不想插入明确的stream << "\r\n"。)

8

  • 2
    据我所知,这取决于平台。只需在文本模式下打开流(隐式执行,如果您禁用文本模式,则有一个二进制标志),在 Windows 上它应该隐式执行。


    – 


  • 3
    您不想插入的原因是什么"\r\n"


    – 

  • 4
    据我所知,它std::endl从来都不是用来写\r回车符的。它是\n行尾 + 缓冲区刷新。对我来说,它的表现符合预期。


    – 


  • 2
    在 C++ 字符串(和 C 中)中,行尾用 标记'\n'。当您文本写入控制台时,输出库会将系统特定的行尾序列写入控制台。在 Windows 上,写入"\n"控制台会产生"\r\n";在 Unix 系统上,它只是普通的"\n",而在较旧的 Mac 上(如果我没记错的话),它只是普通的"\r"。当您从控制台读取文本时,输入库会进行反向转换,将系统特定的行尾序列转换为'\n'。那么,为什么您要编写与操作系统期望不匹配的行尾呢?


    – 

  • 2
    你为什么需要"\r\n"?也许(取决于你的答案)你的问题是一个


    – 


最佳答案
1

根据的行为std::endl;定义,'\n'仅插入字符(然后刷新流)。

如果您想要相同的行为,但总是插入"\r\n"而不是'\n'那么我想您可以构建一个自定义操纵器,如下所示:

#include <iostream>

template<class CharT, class Traits>
std::basic_ostream<CharT, Traits>& crlf(std::basic_ostream<CharT, Traits>& os)
{
    return os.put(os.widen('\r'))
        .put(os.widen('\n'))
        .flush();
}

int main()
{
    std::cout << "Hello World!" << std::endl; // always "\n"
    std::cout << "Hello World!" << crlf; // always "\r\n"
}

注意:调用是为了模仿endl操纵器的行为。

5

  • 5
    但但但只是str::string crlf = "\r\n"


    – 

  • 6
    甚至constexpr auto crlf = "\r\n";


    – 

  • 大家好。我同意你的看法,哈哈。这个答案和楼主的回答差不多,只要他们明确规定<< "\r\n"


    – 

  • 2
    为了更加等同于std::endl,这不应该插入"\r\n"、刷新流,然后返回吗os


    – 


  • 1
    @Chris 说得好,我会补充这一点。


    –