2008-09-16 2 views
15

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

ответ

6

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

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

Я нашел this implementation «teestream», который позволяет одному выходу перейти к нескольким потокам. Вы можете реализовать поток, который отправляет данные в OutputDebugString.

+1

-1, неправильный. См. Ответ Бена. – MSalters 2010-08-20 07:27:35

1

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

+0

Нет, вы не можете, потому что оценка cin сама по себе не имеет никакого эффекта. – ben 2008-09-16 21:20:08

8

Вы можете захватывать вывод соиЬ, как это, например:

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; 

Magicking его в окне вывода Visual Studio 2005 остается в качестве упражнения для визуального разработчика плагина Studio 2005 с. Но вы, вероятно, можете перенаправить его в другом месте, например, в файл или пользовательское окно, возможно, написав собственный класс streambuf (см. Также boost.iostream).

+3

Плагин не нужен, просто используйте OutputDebugString, как упоминал Майк Диммик. – jwfearn 2008-09-26 13:58:47

2

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

+0

это выглядит так: http://www.codeproject.com/KB/debug/debugout.aspx – wimh 2011-03-09 22:17:59

0

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

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 
} 

БОНУС TIP: Если вы пишете:

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

в окне вывода, а затем дважды -нажмите на него, затем Visual Studio перейдет к заданному файлу, строка 10 и отобразит «сообщение» в строке состояния. Это очень полезно.

+1

Это работает очень хорошо для меня, но с VS2013 и Boost 1.57 он выходит из строя с ошибкой утверждения в коде Boost как вскоре, когда поток покраснеть, либо распечатав много, либо посылая `std :: endl` в поток, поэтому он больше не может использоваться :-(Не уверен, что это ошибка в Boost или что. – Malvineous 2015-01-18 23:38:19

Смежные вопросы