Stworzyłem aplikację konsolową C++ i po prostu chcę przechwycić instrukcje cout/cerr w oknie wyjściowym w IDE Visual Studio 2005. Jestem pewien, że jest to po prostu ustawienie, którego mi brakuje. Czy ktoś może wskazać mi właściwy kierunek?Przechwytywanie cout w oknie wyjściowym Visual Studio 2005?
Odpowiedz
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.
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.
Nie, nie możesz, ponieważ sama ocena cin nie ma żadnego efektu. – ben
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).
Nie jest wymagana żadna wtyczka, po prostu użyj OutputDebugString, jak wspomniał Mike Dimmick. – jwfearn
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.
wygląda to tak: http://www.codeproject.com/KB/debug/debugout.aspx – wimh
Ponadto, w zależności od swoich zamiarów, a co bibliotek używasz, możesz użyć TRACE macro (MFC) lub ATLTRACE (ATL).
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.
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
- 1. Profilowanie kodu w Visual Studio 2005
- 2. Integracja Mercurial w Visual Studio 2005?
- 3. Czy istnieje sposób, aby uniemożliwić programowi Visual Studio drukowanie wątków i zakończonych instrukcji w oknie wyjściowym?
- 4. Aby zobaczyć wszystkie wiersze polecenia w oknie wyjściowym podczas kompilowania
- 5. Skąd pobrać Visual Studio Express 2005?
- 6. wywoływanie funkcji podczas debugowania w programie Visual Studio 2005?
- 7. Gdzie jest <inttypes.h> w Visual Studio 2005?
- 8. Kod operatora obslugi typu C++, który nie będzie kompilowany w Visual Studio 2012, ale działał dobrze w Visual Studio 2005
- 9. Jak zmienić wersję rozwiązania z Visual Studio 2010 na Visual Studio 2005?
- 10. Pierwsza szansa wyjątek typu "System.IndexOutOfRangeException" w exe w oknie wyjściowym
- 11. Wartość zwracana w oknie Autos programu Visual Studio
- 12. Karta otwartego kodu Visual Studio w nowym oknie
- 13. Visual Studio 2012 - Brak zmiennej w oknie lokalnym
- 14. Co oznacza -1. # IND000 w oknie debugowania Visual Studio?
- 15. Dodawanie edytorów w oknie dialogowym Visual Studio "Otwórz za pomocą ..."
- 16. Jak uzyskać pozycję topLeft w oknie edytora Visual Studio 2008?
- 17. Skonfiguruj Visual Studio 2005, aby wydrukować numery linii
- 18. Visual Studio 2005 nie obsługuje Sql Server 2008
- 19. Jak dodać plik WSDL do projektu programu Visual Studio 2005?
- 20. Obejście dla Visual Studio 2005 C++ dziedziczenie bug
- 21. Jak mogę uruchomić Visual Studio 2005 na Windows 7?
- 22. Jak dodać punkty przerwania debugowania do wierszy wyświetlanych w oknie "Znajdź wyniki" w Visual Studio
- 23. Ropucha dla Oracle - zmiana formatowania w oknie wyjściowym DBMS
- 24. Drukowanie aktualnego czasu w oknie wyjściowym przy użyciu TracePoint
- 25. Włączanie RyuJIT w Visual Studio 2015 RC
- 26. Dlaczego mój projekt aplikacji WWW IIS Express wyświetla błąd w oknie wyjściowym podczas próby załadowania?
- 27. POD w Visual Studio 2008
- 28. Powershell wewnątrz Visual Studio
- 29. Visual Studio warning C4133
- 30. Jak wykonać TDD z maszynopisem w kodzie Visual Studio?
-1, źle. Zobacz odpowiedź Bena. – MSalters