17

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'm missing. Can anyone point me in the right direction?

4

7 回答 7

14

我终于实现了这个,所以我想和你分享一下:

#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
}

额外提示:如果你写:

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

到输出窗口,然后双击它,Visual Studio 将跳转到给定文件的第 10 行,并在状态栏中显示“消息”。它非常有用。

于 2011-05-22T08:22:04.470 回答
8

您可以像这样捕获 cout 的输出,例如:

std::streambuf* old_rdbuf = std::cout.rdbuf();
std::stringbuf new_rdbuf;
// replace default output buffer with string buffer
std::cout.rdbuf(&new_rdbuf);

// write to new buffer, make sure to flush at the end
std::cout << "hello, world" << std::endl;

std::string s(new_rdbuf.str());
// restore the default buffer before destroying the new one
std::cout.rdbuf(old_rdbuf);

// show that the data actually went somewhere
std::cout << s.size() << ": " << s;

将其魔术到 Visual Studio 2005 输出窗口中作为练习留给 Visual Studio 2005 插件开发人员。但是您可能可以通过编写自定义 streambuf 类(另请参见 boost.iostream)将其重定向到其他地方,例如文件或自定义窗口。

于 2008-09-16T16:59:26.543 回答
6

你不能这样做。

如果要输出到调试器的输出窗口,请调用 OutputDebugString。

我发现了一个“teestream”的实现,它允许一个输出到多个流。您可以实现一个将数据发送到 OutputDebugString 的流。

于 2008-09-16T15:07:21.073 回答
2

本的答案和迈克迪米克的结合:您将实现一个最终调用 OutputDebugString 的 stream_buf_。也许有人已经这样做了?看看两个提议的 Boost 日志库。

于 2008-09-17T00:39:30.853 回答
1

这是输出屏幕只是闪烁然后消失的情况吗?如果是这样,您可以通过使用 cin 作为返回前的最后一条语句来保持打开状态。

于 2008-09-16T15:07:29.823 回答
0

此外,根据您的意图以及您使用的库,您可能想要使用TRACE 宏( MFC ) 或ATLTRACE ( ATL )。

于 2008-09-17T07:24:22.643 回答
0

写入 std::ostringsteam 然后跟踪它。

std::ostringstream oss;

oss << "w:=" << w << " u=" << u << " vt=" << vt << endl;

TRACE(oss.str().data());
于 2019-08-20T12:17:53.213 回答