redirect stdout/stderr to a string

时间:2022-05-25 21:01:59

Q:

there has been many previous questions about redirecting stdout/stderr to a file. is there a way to redirect stdout/stderr to a string?



A:

Yes, you can redirect it to an std::stringstream:

std::stringstream buffer; 
std::streambuf * old = std::cout.rdbuf(buffer.rdbuf()); 
 
std::cout << "Bla" << std::endl; 
 
std::string text = buffer.str(); // text will now contain "Bla\n" 


You can use a simple guard class to make sure the buffer is always reset:

struct cout_redirect { 
    cout_redirect( std::streambuf * new_buffer )  
        : old( std::cout.rdbuf( new_buffer ) ) 
    { } 
 
    ~cout_redirect( ) { 
        std::cout.rdbuf( old ); 
    } 
 
private: 
    std::streambuf * old; 
};