2009-10-09 3 views
2

비교적 간단한 문자열 조작을하기 위해 C++ stringstream 클래스를 사용하려고 시도했지만 get() 메소드에 문제가 있습니다. 어떤 이유로 출력 문자를 문자로 추출 할 때마다 최종 문자의 두 번째 사본이 추가됩니다.C++ stringstream이 여분의 문자를 반환합니까?

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

int main() { 
    stringstream ss("hello"); 
    char c; 

    while(!ss.eof()) { 
     ss.get(c); 
     cout << "char: " << c << endl; 
    } 
    return 0; 
} 

프로그램의 출력은 다음과 같습니다이 감사하겠습니다에

char: h 
char: e 
char: l 
char: l 
char: o 
char: o 

어떤 도움을 당신이 내게 줄 수 있습니다.

+0

예, 오타입니다. #include 은 #include이어야합니다. Chris

답변

8

같은 코드가 스트림의 마지막에 곧 도달 할 것이라는 점을 아직 모르고 순서지만, 문자의 다음 추출에 실패합니다. 스트림의 끝 부분에 도달하여 추출에 실패 했으므로 c은 변경되지 않습니다. 프로그램에서 ss.get(c)이 실패했다는 것을 인식하지 못하고 이전 값인 c을 다시 인쇄합니다. 아직이 같은 루프 것 스트림에서 읽을 수있는 문자가 있는지

더 좋은 방법은 확인 : 당신이 말을 읽어 내려고하면 EOF 플래그 만 설정되어

while (ss.get(c)) { 
    cout << "char: " << c << endl; 
} 
+0

그리고 여기에서는 bool() 연산자가 정의 된 표준 스트림의 편리성에 의존합니다. – wilhelmtell

+0

빠른 응답과 자세한 설명을 해주셔서 감사합니다. – Chris

2

루프 순서 때문입니다. \ 0과 EOF를 읽었습니다.

스트림 ss.eof()의 끝에서이

int main() { 
    stringstream ss("hello"); 
    char c; 

    ss.get(c); 
    while(!ss.eof()) { 
     cout << "char: " << c << endl; 
     ss.get(c); 
    } 
    return 0; 
} 
+0

어디에서 보셨습니까 \ n? – leiz

+1

oooops .. typo .. \\ 0을 입력하고 \ n을 입력했습니다. –

1

파일의 다음 코드는 get 대신에 EOF를 테스트하여 문제를 해결합니다.

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

int main() { 
    stringstream ss("hello"); 
    char c; 

    while(1) { 
     ss.get(c); 
     if(ss.eof()) 
      break; 

     cout << "char: " << c << endl; 
    } 
    return 0; 
} 
관련 문제