2009-07-19 14 views

Répondre

63

OutputDebugString fonction le fera.

exemple de code

void CClass::Output(const char* szFormat, ...) 
{ 
    char szBuff[1024]; 
    va_list arg; 
    va_start(arg, szFormat); 
    _vsnprintf(szBuff, sizeof(szBuff), szFormat, arg); 
    va_end(arg); 

    OutputDebugString(szBuff); 
} 
+3

Il y a encore un problème avec cela. _vsnprintf peut tronquer la chaîne formatée pour s'adapter au tampon, mais si cela se produit, la chaîne ne sera pas terminée par un caractère nul. Voir http://msdn.microsoft.com/en-us/library/1kt27hek.aspx et http://stackoverflow.com/questions/357068. – ChrisN

+4

Je reçois une erreur, szBuff est incapable avec le type LPCWSTR –

+0

Vous utilisez le jeu de caractères multi-octets dans les options de votre compilateur. Vous devez ensuite utiliser les versions multi-octets de 'WCHAR szBuff [1024]' '_vsnwprintf' –

62

Si cela est pour la sortie de débogage alors OutputDebugString est ce que vous voulez. Une macro utile:

#define DBOUT(s)   \ 
{        \ 
    std::ostringstream os_; \ 
    os_ << s;     \ 
    OutputDebugString(os_.str().c_str()); \ 
} 

Cela vous permet de dire des choses comme:

DBOUT("The value of x is " << x); 

Vous pouvez étendre cela en utilisant les macros __LINE__ et __FILE__ pour donner encore plus d'informations.

Pour ceux des terres de caractères Windows et large:

#include <Windows.h> 
#include <iostream> 
#include <sstream> 

#define DBOUT(s)   \ 
{        \ 
    std::wostringstream os_; \ 
    os_ << s;     \ 
    OutputDebugStringW(os_.str().c_str()); \ 
} 
+1

Pouvez-vous expliquer cet énoncé un peu? - "Vous pouvez étendre ceci en utilisant les macros __LINE__ et __FILE__ pour donner encore plus d'informations." – sami1592

+1

@ sami1592 Ces deux macros sont définies par le compilateur comme étant la ligne et le fichier (surprise), ce qui vous permet de générer automatiquement des journaux plus utiles contenant la ligne et le fichier. – ZachB

18

Utilisez la fonction OutputDebugString ou TRACE macro (MFC) qui vous permet de faire printf la mise en forme de style:

int x = 1; 
int y = 16; 
float z = 32.0; 
TRACE("This is a TRACE statement\n");  
TRACE("The value of x is %d\n", x); 
TRACE("x = %d and y = %d\n", x, y); 
TRACE("x = %d and y = %x and z = %f\n", x, y, z); 
+0

Voir aussi [ATLTRACE2] (https://msdn.microsoft.com/en-us/library/dhxsse89.aspx) –

+0

Mon compilateur dans Visual Studio ne reconnaît pas ALTTRACE2 ou ALTTRACE. Ai-je besoin d'inclure quelque chose? Est-ce parce que ce n'est pas un projet MFC? C'est juste du C++ pour moi. – Michele

4

solution commune:

#include <iostream> 

//... 
std::cerr << "Text" << std::endl; 
+2

Ce serait la réponse optimale. Malheureusement, cela ne fonctionne pas. – Dunk

+0

@Dunk où cela ne fonctionne pas? C'est OK dans toutes les versions de MSVS –

+2

Assez simple. Il écrit dans la fenêtre de la console mais pas dans la fenêtre de sortie de débogage comme le souhaite l'OP. J'utilise Visual Studio 2013 Premium. – Dunk

0

Utiliser OutputDebugString au lieu de afxD ump.

Exemple:

#define _TRACE_MAXLEN 500 

#if _MSC_VER >= 1900 
#define _PRINT_DEBUG_STRING(text) OutputDebugString(text) 
#else // _MSC_VER >= 1900 
#define _PRINT_DEBUG_STRING(text) afxDump << text 
#endif // _MSC_VER >= 1900 

void MyTrace(LPCTSTR sFormat, ...) 
{ 
    TCHAR text[_TRACE_MAXLEN + 1]; 
    memset(text, 0, _TRACE_MAXLEN + 1); 
    va_list args; 
    va_start(args, sFormat); 
    int n = _vsntprintf(text, _TRACE_MAXLEN, sFormat, args); 
    va_end(args); 
    _PRINT_DEBUG_STRING(text); 
    if(n <= 0) 
     _PRINT_DEBUG_STRING(_T("[...]")); 
} 
Questions connexes