例如,我想用完整的反斜杠-n(无格式std::string my_str( "foobar\n" );
)直接写入。std::ostream&
也许我需要先my_str
使用将反斜杠转换为双反斜杠的格式化函数进行转换?有没有一个标准的库函数呢?
或者也许有一个指令我可以传递给std::ostream&
?
例如,我想用完整的反斜杠-n(无格式std::string my_str( "foobar\n" );
)直接写入。std::ostream&
也许我需要先my_str
使用将反斜杠转换为双反斜杠的格式化函数进行转换?有没有一个标准的库函数呢?
或者也许有一个指令我可以传递给std::ostream&
?
对于较大的字符串,最简单的方法是使用原始字符串文字:
std::string my_str(R"(foobar\n)");
如果要在其中使用括号,请使用分隔符:
R"delim(foobar\n)delim"
我不知道有什么可以让您将转义码等保留在字符串中,但没有输出它,但std::transform
有一个std::ostream_iterator<std::string>
目的地和一个处理您想要的情况的函数应该这样做,就像在这个例子中一样:
std::string filter(char c) {
if (c == '\n') return "\\n";
if (c == '\t') return "\\t";
//etc
return {1, c};
}
int main() {
std::string str{"abc\nr\tt"};
std::cout << "Without transform: " << str << '\n';
std::cout << "With transform: ";
std::transform(std::begin(str), std::end(str), std::ostream_iterator<std::string>(std::cout), filter);
}
既然"foobar\n"
是常量字面量,就写成"foobar\\n"
, 这样"\\"
就变成了"\"
,让n
离开。
你所说的“格式化”不是。
流不格式化字符串。"\n"
with的替换char(10)
是由编译器在从文字生成实际值时进行的。(如果底层平台需要,ostream 最多会转化char(10)
为{ char(10), char(13) }
,但这是另一回事)。
“反斜杠+n”没有被流格式化;例如长度std::string("\n")
为1(而不是 2)。同样'\n'
是单个字符。您编写反斜杠 + n 的事实只是表示不可打印(和非 ASCII)字符的快捷方式。
再举一个例子,'\x0a' == '\n'
(因为0a
是换行符的十六进制代码)。而且std::string("\x0a").size() == 1
也是。
如果(在 Linux 1上)您打开 astd::ofstream
并写入'\x0a'
该流,那么您最终将得到一个包含单个字节的文件;其十六进制值为0a
。
因此,转换您编写的内容的不是您的流,而是编译器。根据您的用例,您可能想要:
"foobar\\n"
(注意这将长度增加1)1在 Windows 上,'\n'
字符在文本模式下被转换为"\r\n"
(回车 + 换行)。
这与std::ostream
or无关std::string
。"foobar\n"
是一个\n
已经意味着行尾的文字。
你有两个选择:
\n
符号\
std::string str("foobar\\n");
std::string str(R"(foobar\n)");