使用反斜杠的转义序列在编译时而不是运行时被解析并转换为适当的字符代码。为了使其正常工作,您需要在从文件中加载字符串后自己处理字符串并替换转义序列。下面的示例显示了执行此操作的简单方法。
#include <iostream>
#include <string>
void replace_needle(
std::string &haystack,
const std::string& needle,
const std::string& with)
{
std::string::size_type pos;
while((pos = haystack.find(needle)) != std::string::npos)
{
haystack.replace(pos, needle.size(), with);
}
}
int main()
{
// use double backslashes to simulate the exact string read from the file
std::string str = "This is first line\\r\\nThis is second line";
static const std::string needle1 = "\\n";
static const std::string needle2 = "\\r";
std::cout << "Before\n" << str << std::endl;
replace_needle(str, needle1, "\n");
replace_needle(str, needle2, "\r");
std::cout << "After\n" << str << std::endl;
}
下面是一个严格的 MFC 解决方案,它做同样的事情。
int main()
{
// use double backslashes to simulate the exact string read from the file
CStringA str = "This is first line\\r\\nThis is second line";
std::cout << "Before\n" << str << std::endl;
str.Replace("\\n", "\n");
str.Replace("\\r", "\r");
std::cout << "After\n" << str << std::endl;
}
您当然可以替换整个 "\r\n" 序列而不是每个单独的转义值。我选择不这样做,因为我不确定您正在寻找的灵活性。两种解决方案都会产生以下输出。
之前
这是第一行\r\n这是第二行
之后
这是第一行
这是第二行