关于c ++:在Visual Studio 2005输出窗口中捕获cout?

关于c ++:在Visual Studio 2005输出窗口中捕获cout?

Capturing cout in Visual Studio 2005 output window?

我创建了一个C ++控制台应用程序,只想在Visual Studio 2005 IDE的"输出"窗口中捕获cout / cerr语句。 我确定这只是我所缺少的设置。 谁能指出我正确的方向?


我终于实现了这一点,因此想与您分享:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#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!
"
;
    cout.flush(); // you may need to flush in some circumstances
}

奖励提示:如果您写:

1
2
X:\full\file
ame.txt(10) : message

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)。


你做不到

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

我发现了这种" teestream"的实现,它允许一个输出进入多个流。您可以实现将数据发送到OutputDebugString的流。


ben的答案和Mike Dimmick的答案的结合:您将实现一个stream_buf_,最终调用OutputDebugString。也许有人已经这样做了?看一下两个建议的Boost日志库。


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


写入std :: ostringsteam,然后进行跟踪。

1
2
3
4
5
std::ostringstream oss;

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

TRACE(oss.str().data());


另外,根据您的意图以及所使用的库,您可能希望使用TRACE宏(MFC)或ATLTRACE(ATL)。


推荐阅读

    linux常用输出命令?

    linux常用输出命令?,工作,系统,地址,管理,信息,标准,命令,目录,数据,位置,lin

    linux声音输出命令?

    linux声音输出命令?,电脑,系统,设备,服务,软件,数据,工具,情况,手机,命令,lin

    linux打开控制台命令?

    linux打开控制台命令?,工作,系统,信息,地址,命令,目录,基础,工具,管理,第一,l

    linux控制台保存命令?

    linux控制台保存命令?,状态,系统,命令,电脑,文件,编辑,终端,模式,历史,存在,l

    用linux命令输出id?

    用linux命令输出id?,系统,设备,工作,信息,地址,命令,工具,基础,目录,进程,lin

    linux控制台创建命令?

    linux控制台创建命令?,工作,地址,系统,命令,信息,目录,管理,名字,文件,控制

    linux命令输出太多?

    linux命令输出太多?,命令,标准,信息,时间,名称,文件,内容,屏幕,模式,目录,lin

    linux命令输出截图?

    linux命令输出截图?,工具,图片,代码,截图,环境,支柱,网络,标准,发展,命令,Lin

    linux控制台多命令行?

    linux控制台多命令行?,工具,服务,情况,地址,连续,命令,窗口,终端,脚本,控制

    linux系统输出命令?

    linux系统输出命令?,系统,工作,地址,信息,命令,工具,目录,设备,基础,发行,lin

    写5条linux命令语句?

    写5条linux命令语句?,工作,地址,系统,信息,目录,命令,管理,标准,功能,文件,li

    linux命令语句规律?

    linux命令语句规律?,系统,管理,基础,网络,信息,命令,服务,简介,工具,标准,lin

    linux输出第二列命令?

    linux输出第二列命令?,数据,信息,时间,软件,百度,单位,适当,系统,命令,文件,l

    linux怎么输出命令?

    linux怎么输出命令?,标准,信息,系统,状态,实时,时间,工具,分析,单位,数据,Lin

    linux命令行输出暂停?

    linux命令行输出暂停?,暂停,服务,系统,管理,代码,环境,信息,数据,网络,跨行,E

    linux控制台停止命令?

    linux控制台停止命令?,地址,工具,平台,网络,下来,电脑,状态,命令,程序,进程,L

    linux命令输出加时间?

    linux命令输出加时间?,时间,系统,名称,设备,命令,信息,管理,标准,数字,百度,l

    linux命令日志输出?

    linux命令日志输出?,系统,状态,命令,情况,对比,标准,实时,服务,下来,数据,怎

    linux命令输出到vi?

    linux命令输出到vi?,工作,系统,状态,档案,命令,模式,信息,正规,第一,编辑,lin

    linux命令输出截取?

    linux命令输出截取?,位置,网上,信息,命令,字符串,字符,左边,日志,中间,之间,L