#include <iostream>
#include <sstream>
class cerr_redirector
{
public:
cerr_redirector(std::ostream& os)
:backup_(std::cerr.rdbuf())
,sbuf_(os.rdbuf())
{
std::cerr.rdbuf(sbuf_);
}
~cerr_redirector()
{
std::cerr.rdbuf(backup_);
}
private:
cerr_redirector();
cerr_redirector(const cerr_redirector& copy);
cerr_redirector& operator =(const cerr_redirector& assign);
std::streambuf* backup_;
std::streambuf* sbuf_;
};
int main()
{
{
std::ostringstream os;
cerr_redirector redirector(os);
std::cerr << "This is written to the stream" << std::endl;
std::cout << "This is written to stdout" << std::endl;
std::cout << "and now: " << os.str() << std::endl;
}
std::cerr << "Redirector has been been destroyed. Standard error restored." << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KCmNsYXNzIGNlcnJfcmVkaXJlY3Rvcgp7CnB1YmxpYzoKICAgIGNlcnJfcmVkaXJlY3RvcihzdGQ6Om9zdHJlYW0mIG9zKQogICAgICAgIDpiYWNrdXBfKHN0ZDo6Y2Vyci5yZGJ1ZigpKQogICAgICAgICAsc2J1Zl8ob3MucmRidWYoKSkKICAgIHsKICAgICAgICBzdGQ6OmNlcnIucmRidWYoc2J1Zl8pOwogICAgfQoKICAgIH5jZXJyX3JlZGlyZWN0b3IoKQogICAgewogICAgICAgIHN0ZDo6Y2Vyci5yZGJ1ZihiYWNrdXBfKTsKICAgIH0KCnByaXZhdGU6CiAgICBjZXJyX3JlZGlyZWN0b3IoKTsKICAgIGNlcnJfcmVkaXJlY3Rvcihjb25zdCBjZXJyX3JlZGlyZWN0b3ImIGNvcHkpOwogICAgY2Vycl9yZWRpcmVjdG9yJiBvcGVyYXRvciA9KGNvbnN0IGNlcnJfcmVkaXJlY3RvciYgYXNzaWduKTsKCiAgICBzdGQ6OnN0cmVhbWJ1ZiogYmFja3VwXzsKICAgIHN0ZDo6c3RyZWFtYnVmKiBzYnVmXzsKfTsKCgppbnQgbWFpbigpCnsKICAgIHsKICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CiAgICAgICAgY2Vycl9yZWRpcmVjdG9yIHJlZGlyZWN0b3Iob3MpOwogICAgICAgIHN0ZDo6Y2VyciA8PCAiVGhpcyBpcyB3cml0dGVuIHRvIHRoZSBzdHJlYW0iIDw8IHN0ZDo6ZW5kbDsKCiAgICAgICAgc3RkOjpjb3V0IDw8ICJUaGlzIGlzIHdyaXR0ZW4gdG8gc3Rkb3V0IiA8PCBzdGQ6OmVuZGw7CgogICAgICAgIHN0ZDo6Y291dCA8PCAiYW5kIG5vdzogIiA8PCBvcy5zdHIoKSA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICBzdGQ6OmNlcnIgPDwgIlJlZGlyZWN0b3IgaGFzIGJlZW4gYmVlbiBkZXN0cm95ZWQuIFN0YW5kYXJkIGVycm9yIHJlc3RvcmVkLiIgPDwgc3RkOjplbmRsOwp9Cg==