Я думаю, вы неправильно поняли эту концепцию. Линия
cout.rdbuf(ss.rdbuf());
устанавливает указатель на буфер. Он перенаправляет cout
на ss
, а не на консоль. Если вы напишите в cout
, это будет записано в ss
.
Надеюсь, это прояснит для вас
#include <iostream>
#include <string>
#include <sstream>
int main() {
std::streambuf *backup;
backup = std::cout.rdbuf();
std::stringstream ss;
std::cout.rdbuf(ss.rdbuf());
std::cout << "Test" << std::endl;
std::cout.rdbuf(backup);
std::cout << ss.rdbuf();
return 0;
}
В примере кода я создаю копию текущего указателя буфера cout
. Затем я перенаправляю cout
на ss
. Когда я пишу в cout
, это записывается в буфер ss
. Затем я перенаправляю cout
обратно на консоль и распечатываю содержимое ss
.
Если вы хотите манипулировать буфером, вам нужно что-то вроде
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
int main() {
std::stringstream ss{ "test" };
std::stringbuf *pbuf = ss.rdbuf();
char buffer[80];
pbuf->sgetn (buffer,80);
std::streambuf *pbuf2 = std::cout.rdbuf();
pbuf2->sputn (buffer, std::strlen(buffer));
return 0;
}