读“\ n”字符串并写入文本文件?

时间:2013-04-11 15:06:49

标签: c++ string escaping

我正在努力解决以下问题:我正在从XML文件中读取以下std :: stringstream

"sigma=0\nreset"

在将一些复制和处理写入文本文件之后。我希望以下

sigma=0
reset

但遗憾的是我只能

sigma=0\nreset

但是直接流式传输

out << "sigma=0\nreset"

我明白了:

sigma=0
reset

我目前怀疑“复制和处理”期间“\ n”的某些限定符会丢失......这可能吗?如何在流中追踪不再是换行符的“\ n”?

谢谢!

2 个答案:

答案 0 :(得分:3)

这是因为输出函数不处理像'\n'那样的转义序列,它是编译器所做的,然后只用于文字。编译器对字符串的内容一无所知,因此在字符串内部不能将"\n"转换为换行符。

您必须解析字符串本身,并在适当时写出换行符。

答案 1 :(得分:1)

假设std::stringstream实际上包含的文字等同于文字"sigma=0\\nreset"(长度= 14个字符)而不是"sigma=0\nreset"(长度= 13个字符),则必须更换它自己。这样做并不是很困难,要么使用提升replace_allhttp://www.boost.org/doc/libs/1_53_0/doc/html/boost/algorithm/replace_all.html),要么std::string::findstd::string::replace

std::stringstream inStream;
inStream.str ("sigma=0\\nreset");
std::string content = inStream.str();

size_t index = content.find("\\n",0);

while(index != std::string::npos)
{
   content.replace(index, 2, "\n");
   index = content.find("\\n",index);
}

std::cout << content << '\n';

注意:您可能需要考虑系统行尾不是"\n"

的情况

如果std::stringstream实际上包含"sigma=0\nreset",请发布执行复制/处理和写入文本文件的代码。