Почему строковые потоки rdbuf() и str() выдают разные результаты?
-
05-09-2019 - |
Вопрос
У меня есть этот код,
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() :эй эй мед копай
ss.rdbuf():эй, копай
Но почему?Это из-за ostreams определение оператора <str() дает мне другой результат.На мой взгляд, результат должен быть таким же, даже если я использовал getline.
Решение
ss.rdbuf()->str();
Возвращает копию всего содержимого буфера.
Что делаешь std::cout << ss.rdbuf();
?
См. описание для
basic_ostream<charT,traits>& operator<<(basic_streambuf<charT,traits>* sb);
Он считывает посимвольно из буфера и записывает их в ostream до тех пор, пока не произойдет eof/сбой при записи/исключении.
Вы уже прочитали одно слово из баффа.Теперь он читает остальную часть.
Другие советы
Цитата из Библии о потоковом вводе-выводе C++: Лангер и Крефт, вызывая str() в буфере потока (т.е.вещь, возвращаемая rdbuf()), «ведёт себя крайне нелогично» (стр. 72 в моём издании).Чтобы узнать всю историю, вам придется прочитать книгу.
Если вы не получили здесь удовлетворительного ответа, попробуйте группу usenet: