0

我的 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,因此字符串对象清楚地包含控制字符,但为什么 strong 没有相应地格式化?

4

1 回答 1

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这是第二行
之后
这是第一行
这是第二行

于 2013-06-24T16:36:54.803 回答