2008-09-16 9 views

Odpowiedz

6

Nie możesz tego zrobić.

Jeśli chcesz wyprowadzać dane do okna wyjściowego debuggera, wywołaj OutputDebugString.

Znalazłem this implementation z "teestream", który pozwala jedno wyjście, aby przejść do wielu strumieni. Można zaimplementować strumień, który wysyła dane do OutputDebugString.

+1

-1, źle. Zobacz odpowiedź Bena. – MSalters

1

Czy to przypadek ekranu wyjściowego po prostu miga, a następnie znika? jeśli tak, możesz zachować to otwarcie, używając cin jako ostatniego zdania przed powrotem.

+0

Nie, nie możesz, ponieważ sama ocena cin nie ma żadnego efektu. – ben

8

Można uchwycić wyjścia cout tak, na przykład:

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 go do okna wyjściowego Visual Studio 2005 jest pozostawiony jako ćwiczenie dla Visual Studio 2005 wtyczki dewelopera. Ale prawdopodobnie mógłbyś przekierować go gdzie indziej, jak plik lub niestandardowe okno, być może pisząc niestandardową klasę streaguf (patrz także boost.iostream).

+3

Nie jest wymagana żadna wtyczka, po prostu użyj OutputDebugString, jak wspomniał Mike Dimmick. – jwfearn

2

Kombinacja odpowiedzi ben'a i Mike'a Dimmicka: implementowałbyś stream_buf_, który kończy wywoływanie OutputDebugString. Może ktoś już to zrobił? Spójrz na dwie proponowane biblioteki rejestrowania Boost.

+0

wygląda to tak: http://www.codeproject.com/KB/debug/debugout.aspx – wimh

14

mam w końcu ten realizowany, więc chcę podzielić się z wami:

#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: Jeśli piszesz:

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

do okna wyjściowego i następnie dwukrotnie -kliknij na niego, następnie Visual Studio przejdzie do podanego pliku, linii 10, i wyświetli "komunikat" na pasku stanu. Jest to przydatne przy użyciu bardzo.

+1

To działa bardzo dobrze dla mnie, ale z VS2013 i Boost 1.57 zawiesza się z niepowodzeniem asercji w kodzie boost wkrótce, gdy strumień zostanie przepłukany, albo przez drukowanie dużo lub przez wysłanie 'std :: endl' do strumienia, więc nie jest już użyteczny :-(Nie jestem pewien, czy jest to błąd w Boost lub co. – Malvineous

Powiązane problemy