Search code examples
c++cstdoutstderr

Is there a way to redirect stdout/stderr to a string?


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


Solution

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