Capturing cout in Visual Studio 2005 output window?

后端 未结 7 1559
北海茫月
北海茫月 2020-12-05 15:15

I created a C++ console app and just want to capture the cout/cerr statements in the Output Window within the Visual Studio 2005 IDE. I\'m sure this is just a setting that I

相关标签:
7条回答
  • 2020-12-05 15:21

    A combination of ben's answer and Mike Dimmick's: you would be implementing a stream_buf_ that ends up calling OutputDebugString. Maybe someone has done this already? Take a look at the two proposed Boost logging libraries.

    0 讨论(0)
  • 2020-12-05 15:27

    I've finally implemented this, so I want to share it with you:

    #include <vector>
    #include <iostream>
    #include <windows.h>
    #include <boost/iostreams/stream.hpp>
    #include <boost/iostreams/tee.hpp>
    
    using namespace std;
    namespace io = boost::iostreams;
    
    struct DebugSink
    {
        typedef char char_type;
        typedef io::sink_tag category;
    
        std::vector<char> _vec;
    
        std::streamsize write(const char *s, std::streamsize n)
        {
            _vec.assign(s, s+n);
            _vec.push_back(0); // we must null-terminate for WINAPI
            OutputDebugStringA(&_vec[0]);
            return n;
        }
    };
    
    int main()
    {
        typedef io::tee_device<DebugSink, std::streambuf> TeeDevice;
        TeeDevice device(DebugSink(), *cout.rdbuf());
        io::stream_buffer<TeeDevice> buf(device);
        cout.rdbuf(&buf);
    
        cout << "hello world!\n";
        cout.flush(); // you may need to flush in some circumstances
    }
    

    BONUS TIP: If you write:

    X:\full\file\name.txt(10) : message
    

    to the output window and then double-click on it, then Visual Studio will jump to the given file, line 10, and display the 'message' in status bar. It's very useful.

    0 讨论(0)
  • 2020-12-05 15:28

    Write to a std::ostringsteam and then TRACE that.

    std::ostringstream oss;
    
    oss << "w:=" << w << " u=" << u << " vt=" << vt << endl;
    
    TRACE(oss.str().data());
    
    0 讨论(0)
  • 2020-12-05 15:32

    You can't do this.

    If you want to output to the debugger's output window, call OutputDebugString.

    I found this implementation of a 'teestream' which allows one output to go to multiple streams. You could implement a stream that sends data to OutputDebugString.

    0 讨论(0)
  • 2020-12-05 15:32

    Is this a case of the output screen just flashing and then dissapearing? if so you can keep it open by using cin as your last statement before return.

    0 讨论(0)
  • 2020-12-05 15:32

    Also, depending on your intentions, and what libraries you are using, you may want to use the TRACE macro (MFC) or ATLTRACE (ATL).

    0 讨论(0)
提交回复
热议问题