Почему строковые потоки rdbuf () и str () дают разные результаты? - PullRequest
5 голосов
/ 08 апреля 2009

У меня есть этот код,

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 med dig

ss.rdbuf (): хей мед коп

Но почему это? Это из-за ostreams определение оператора

Ответы [ 2 ]

7 голосов
/ 08 апреля 2009
ss.rdbuf()->str();

Возвращает копию всего содержимого буфера.

Что делает std::cout << ss.rdbuf();?

См. Описание для

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

Он читает символ за символом из буфера и записывает их в ostream, пока не произойдет eof / fail при записи / исключение

Вы уже прочитали одно слово из баффа. Теперь прочитайте остальную часть.

2 голосов
/ 08 апреля 2009

Чтобы процитировать цитату из Библии о потоковом вводе-выводе C ++, Langer и Kreft , вызов str () в потоковом буфере (то есть то, что возвращает rdbuf ()) "ведет себя крайне нелогичным образом «(стр. 72 в моем издании). Для полной истории вам придется прочитать книгу.

Если вы не получили здесь удовлетворительного ответа, попробуйте группу usenet:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...