2009-04-07 5 views
5

이 코드는, stringstreams rdbuf()와 str()이 다른 출력을주는 이유는 무엇입니까?

int main() 
{ 
    std::string st; 
    std::stringstream ss; 
    ss<<"hej hej med dig"<<std::endl; 

    std::getline(ss,st,' '); 
    std::cout <<"ss.rdbuf()->str() : " << ss.rdbuf()->str(); 
    std::cout <<"ss.rdbuf() : " << ss.rdbuf(); 
    return 0; 
} 

날이 출력주기가

ss.rdbuf() -> STR() : HEJ가 HEJ이

ss.rdbuf을 파고 MED() : HEJ 메디 파기

왜 그렇습니까? ostreams 연산자의 정의로 인해 < str()은 다른 출력을 제공합니다. getline을 사용한 경우에도 내 눈에는 출력이 동일해야합니다.

답변

6
ss.rdbuf()->str(); 

반환 모든 버퍼 내용의 복사합니다.

무엇을하고 있습니까 std::cout << ss.rdbuf();?

basic_ostream<charT,traits>& operator<<(basic_streambuf<charT,traits>* sb); 

에 대한

설명을 참조 그것은 EOF 때까지// 예외가 발생 작성에 실패, 버퍼에서 문자로 문자를 읽고 ostream에 그 물품.

이미 버프에서 한 단어를 읽었습니다. 이제 나머지 부분을 읽었습니다.

+0

오. 내가 값 비싼 C++ 서적 중 하나에서 찾은 사실은 휴가 중이므로 나는 단지 구글을 가졌고 이해할 수있는 방식으로 연산자 << 행동을 설명하는 사이트를 찾을 수 없었다. 실제로 getline이 스트림에서 delim으로 토큰을 제거했다고 생각했습니다. – mslot

+1

값 비싼 C++ 책을 사용하지 않았습니다. 나는이 동작이 rbuf()가 지정되지 않았으며이 오버로딩 연산자 <<에 대한 표준을 살펴 보았습니다. – bayda

+1

http://ra.dkuug.dk/jtc1/sc22/open/n2356/ - 무료 C++ 표준 초안 – bayda

3

스트림 버퍼 (즉, rdbuf()에 의해 반환 된 것)에서 str()을 호출하면 "매우 직관적이지 않은 방식으로 작동합니다"(72 페이지의 내 에디션에서 72 페이지의 C++ 스트림 I/O에서 성경 인용문을 인용하십시오.). 전체 내용은이 책을 읽어야합니다. 당신이 여기에서 만족스러운 답변을 얻지 않는 경우에

, 유즈넷 그룹을 시도해보십시오

http://groups.google.com/group/comp.lang.c++.moderated

+0

오. 나는 그 책에 대해 결코 머리를 쓰지 않았다 !! 좋은 책처럼 들립니다. 왜냐하면 C++ 스트림의 복잡성과 비슷하다고 생각하기 때문입니다. – mslot

+0

스트림에 관심이 있다면 좋은 책입니다. 솔직히, (포함 된) C++ 프로그래머는 거의 없습니다. –

+0

하지만 내 예제에서는 getline의 첫 번째 매개 변수가 call-by-reference로 인해 rdbuf() 및 rdbuf() -> str()을 반환하지 않아야합니까? – mslot

관련 문제