我的CString(“\ r \ n”)中有新的行字符,而不是保存到文本文件中。我重新加载文本文件中的字符串以及控制字符,但是当我显示它时,控制字符也会显示,而不是创建新行。
// after I read the string from file
my_string = "This is firstline\r\nThis is second line";
AfxMessageBox(my_string);
这个输出是一行中的所有文本,而我期待两行。
调试器确实显示了我在上面指出的my_string,所以字符串对象显然包含控制字符,但为什么强版没有相应的格式呢?
答案 0 :(得分:1)
使用反斜杠的转义序列在编译时解析并转换为适当的字符代码而不是运行时。为了使其工作,您需要处理字符串并在从文件加载后自行替换转义序列。下面的示例显示了一种简单的方法。
#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这是第二行
后 这是第一行 这是第二行