我正在使用 向 std::stringstream 添加一些行stream << "content" << std::endl
。然后我通过 获取内容stream.str()
。如果将 添加std::endl
到 中,std::stringstream
这将用作\n
行结尾。
如果添加了,是否可以强制std::stringstream
使用特定的行结尾?"\r\n"
std::endl
(我不想插入明确的stream << "\r\n"
。)
8
最佳答案
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 说得好,我会补充这一点。
–
|
–
"\r\n"
?–
std::endl
从来都不是用来写\r
回车符的。它是\n
行尾 + 缓冲区刷新。对我来说,它的表现符合预期。–
'\n'
。当您将文本写入控制台时,输出库会将系统特定的行尾序列写入控制台。在 Windows 上,写入"\n"
控制台会产生"\r\n"
;在 Unix 系统上,它只是普通的"\n"
,而在较旧的 Mac 上(如果我没记错的话),它只是普通的"\r"
。当您从控制台读取文本时,输入库会进行反向转换,将系统特定的行尾序列转换为'\n'
。那么,为什么您要编写与操作系统期望不匹配的行尾呢?–
"\r\n"
?也许(取决于你的答案)你的问题是一个–
|