例如,我想用完整的反斜杠-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::ostreamor无关std::string。"foobar\n"是一个\n已经意味着行尾的文字。
你有两个选择:
\n符号\ std::string str("foobar\\n");std::string str(R"(foobar\n)");