C ++ - не получить результат после сброса std :: cout - PullRequest
0 голосов
/ 19 ноября 2018
using namespace std;
string str{ "text" };
stringstream ss{ str };
cout.rdbuf(ss.rdbuf());
cout.flush(); //cout<<endl;

Ожидается, что этот код напечатает текст , но показывает ничто .

Я связываю ss с stdout затем сбросьте его, но я не знаю, почему это не сработало, даже если я ссылаюсь на множество иллюстраций.

cout<<rdbuf(ss);

это нормально, но где же другое?: (

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

В качестве дополнения к ответу @Thomas Sablik ниже приведен пример кода для печати «текста» путем перенаправления потоков:

std::stringstream ss;
ss.basic_ios<char>::rdbuf(std::cout.rdbuf());
ss << "text";
std::cout.flush();

Если вы хотите скопировать содержимое потокового буфера ss в std::cout, вы можете использовать средство вставки напрямую:

std::string str{ "text" };
std::stringstream ss{ str };
std::cout << ss.rdbuf();
std::cout.flush();

http://wordaligned.org/articles/cpp-streambufs

0 голосов
/ 19 ноября 2018

Я думаю, вы неправильно поняли эту концепцию. Линия

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;
}
...