Захватить cout в окне вывода Visual Studio 2005? - PullRequest
17 голосов
/ 16 сентября 2008

Я создал консольное приложение C ++ и просто хочу записать операторы cout / cerr в окне вывода в интегрированной среде разработки Visual Studio 2005. Я уверен, что это просто настройка, по которой я скучаю. Кто-нибудь может указать мне правильное направление?

Ответы [ 6 ]

14 голосов
/ 22 мая 2011

Я наконец-то реализовал это, поэтому я хочу поделиться с вами:

#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, и отобразит «сообщение» в строке состояния. Это очень полезно.

8 голосов
/ 16 сентября 2008

Вы можете захватить вывод команды 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).

6 голосов
/ 16 сентября 2008

Вы не можете сделать это.

Если вы хотите вывести в окно вывода отладчика, вызовите OutputDebugString.

Я нашел эту реализацию 'teestream', которая позволяет одному выходу идти в несколько потоков. Вы могли бы реализовать поток, который отправляет данные в OutputDebugString.

2 голосов
/ 17 сентября 2008

Сочетание ответа Бена и Майка Диммика: вы будете реализовывать stream_buf_, который в итоге вызовет OutputDebugString. Может быть, кто-то уже сделал это? Взгляните на две предложенные библиотеки журналирования Boost.

1 голос
/ 16 сентября 2008

Это случай, когда экран вывода просто мигает, а затем исчезает? если это так, вы можете оставить его открытым, используя cin в качестве последнего выражения перед возвращением.

0 голосов
/ 17 сентября 2008

Кроме того, в зависимости от ваших намерений и библиотек, которые вы используете, вы можете использовать макрос TRACE ( MFC ) или ATLTRACE ( АТЛ ).

...