Stringstream不复制新行

时间:2013-08-27 10:20:55

标签: c++ stringstream

将字符串传递给字符串流时,特殊字符消失。 我尝试了这个可以直接测试的代码:

#include <iostream>
#include <sstream>
using namespace std;

int main(int argc, char* argv[]) {

 string txt("hehehaha\n\t hehe\n\n<New>\n\ttest:\t130\n\ttest_end:\n<New_end>\n");

 cout << txt << endl; // No problem with new lines and tabs

 stringstream stream;
 stream << txt;
 string s;
 while(stream >> s) {
  cout << s;  // Here special characters like '\n' and '\t' don't exist anymore.
 }
 cout << "\n\n";

 return 0;
}

我能做些什么来克服这个问题?

编辑:我试过了:

stream << txt.c_str();

它有效。但我不知道为什么......

2 个答案:

答案 0 :(得分:1)

基本上,你只是打错了,应该是:

cout << stream.str() << endl;

一些细节。您正在呼叫operator<<(string)

  

重载运算符&lt;&lt;表现如ostream :: operator&lt;&lt;   对于c-strings

对引用的行为进行了解释here

  

(2)字符序列将C字符串s插入os。终止   null字符未插入os。 c字符串的长度是   事先确定(好像在调用strlen)。

Strlen documentation表示结果只受

的影响
  

终止空字符

实际上,您的示例中的strlen(tmp)输出55。

因此,流将“分配”输入字符串中第55个字符的所有内容。

cout << stream.str() << endl;

会告诉你确实发生了这种情况。

括号:您可以通过设置/取消设置标志来修改stream << txt行的行为,如

 stream.unsetf ( std::ios::skipws );

你应该试试。

答案 1 :(得分:0)

声明

while(stream >> s)

问题在于,每次调用都会给你一个令牌,使用空格进行拆分,因而忽略它们。