2013-08-27 3 views
2

문자열을 문자열로 전달하면 특수 문자가 사라집니다. 내가 이것을 극복하기 위해 할 수있는 일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(); 

그것은 일 : 나는 이것을 시도했다. 하지만

+1

당신은 >> 임의의 공백에서 분할을 알고 있습니까? – PlasmaHH

+0

나는 그렇지 않았습니다. 그러나 stringstream이 아니라 ifstream을 사용할 때는 ifstream >> char을 사용합니다. 공백은 무시되지 않고 char로 전달됩니다. stringstream을 사용하는 이유는 무엇입니까? –

+0

@ AlexandreToqué >> char는 >> 문자열과 동일하지 않습니다. – doctorlove

답변

0

... 왜 문

while(stream >> s) 

을 모르는 문제가 그것은 그들을 무시 분할에 대한 공백을 사용하여 각 통화 당신에게 하나의 토큰을 제공하고 그에.

+0

네, 그걸 보았습니다. 그러나 char로 바꾸면 문제가 해결되지 않습니다. –

1

기본적으로, 당신은 단지 잘못 인쇄, 그것은해야한다 :

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

일부 세부 사항.

: 당신은 here 설명 과부하의 ostream에에 설명 된대로 < < 행동하는 운영자 : 운영자 < < C-문자열이

행동에 언급 된

operator<<(string)를 호출

(2) 문자 시퀀스 C 문자열 s를 os에 삽입합니다. 종료 문자 인 null 문자는 os에 삽입되지 않습니다. C 문자열의 길이는 미리 결정됩니다 (strlen을 호출하는 것처럼) 입니다.

STRLEN documentation는 결과가

종료 널 문자 귀하의 예제 출력 55

스트림에서 실제로

, strlen(tmp) 아무것도에 의해 영향을받는 것을 말한다 따라서 입력 문자열에서 55 번째 문자까지 "할당"됩니다.

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

실제로 이러한 현상이 발생합니다.

괄호 : 당신은 당신이 시도해야하는

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

에로, 설정/반환하기 플래그에 의해 stream << txt 라인의 동작을 수정할 수 있습니다.

+0

skipws 플래그를 설정 해제하면 cout << stream.str() << endl이 작동합니다. –