2008-09-16 10 views

Respuesta

6

No puede hacer esto.

Si desea realizar una salida a la ventana de salida del depurador, llame a OutputDebugString.

Encontré this implementation de un 'teestream' que permite que una salida vaya a varias transmisiones. Podría implementar una secuencia que envíe datos a OutputDebugString.

+1

-1, mal. Vea la respuesta de Ben. – MSalters

1

¿Es este un caso de la pantalla de salida simplemente parpadeando y luego desapareciendo? de ser así, puede mantenerlo abierto utilizando cin como su última declaración antes de regresar.

+0

No, no se puede porque la evaluación de cin por sí sola no tiene ningún efecto. – ben

8

Puede capturar la salida del cout de este tipo, por ejemplo:

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 en la ventana de resultados de Visual Studio 2005 se deja como ejercicio para un estudio desarrollador de Visual 2005 plugin. Pero probablemente puedas redirigirlo a otro lugar, como un archivo o una ventana personalizada, tal vez escribiendo una clase streambuf personalizada (ver también boost.iostream).

+3

No se necesita ningún complemento, solo use OutputDebugString como menciona Mike Dimmick. – jwfearn

2

Una combinación de la respuesta de Ben y la de Mike Dimmick: implementaría un stream_buf_ que termina llamando a OutputDebugString. ¿Tal vez alguien ya ha hecho esto? Eche un vistazo a las dos bibliotecas de registro de Boost propuestas.

+0

esto se ve así: http://www.codeproject.com/KB/debug/debugout.aspx – wimh

0

También, dependiendo de sus intenciones, y lo que las bibliotecas que está utilizando, es posible que desee utilizar el TRACE macro (MFC) o ATLTRACE (ATL).

14

he implementado finalmente esto, así que quiero compartirlo con ustedes:

#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: Si se escribe:

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

a la ventana de salida y haga doble -Haga clic en él, luego Visual Studio saltará al archivo dado, línea 10, y mostrará el 'mensaje' en la barra de estado. Es muy útil.

+1

Esto ha funcionado muy bien para mí, pero con VS2013 y Boost 1.57 se bloquea con una falla de aserción en el código de Boost como En cuanto la secuencia se vacíe, ya sea imprimiendo mucho o enviando 'std :: endl' a la transmisión, ya no se puede usar :-(No estoy seguro si es un error en Boost o qué. – Malvineous

Cuestiones relacionadas