web-dev-qa-db-fra.com

Comment écrire dans la fenêtre de sortie dans Visual Studio?

Quelle fonction dois-je utiliser pour afficher du texte dans la fenêtre "Sortie" de Visual Studio?

J'ai essayé printf() mais ça ne s'affiche pas.

68
clamp

OutputDebugString function 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);
}
72
Sorantis

S'il s'agit d'une 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 les utilisateurs de Windows et de caractères étendus:

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

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

Utilisez la fonction OutputDebugString ou la TRACE macro (MFC) qui vous permet de mettre en forme le style printf-:

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 );
18
Reunanen
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

wstring outputMe = L"can" + L" concatenate\n";
OutputDebugString(outputMe.c_str());
0
Andrew

Même si OutputDebugString imprime effectivement une chaîne de caractères sur la console du débogueur, ce n'est pas exactement comme printf en ce qui concerne la possibilité de formater des arguments en utilisant la notation % et un nombre variable d'arguments, ce que OutputDebugString ne fait pas.

Je ferais valoir que la macro _RPTFN , avec au moins l'argument _CRT_WARN, est un meilleur prétendant dans ce cas. Elle formate la chaîne principale de la même manière que printf, en écrivant le résultat sur la console du débogueur.

Une mise en garde mineure (et étrange, à mon avis) selon laquelle il faut au moins un argument suivant la chaîne de formatage (celle avec tout le % pour la substitution), une limitation printf ne pas souffre de.

Dans les cas où vous avez besoin d'une fonctionnalité de type puts - pas de formatage, mais simplement d'écrire la chaîne telle quelle - il existe son frère _RPTF0 (qui ignore les arguments suivant la chaîne de formatage, ce qui est un autre avertissement étrange). Ou OutputDebugString bien sûr.

Et au fait, il y a aussi tout du _RPT1 au _RPT5 mais je ne les ai pas essayés. Honnêtement, je ne comprends pas pourquoi prévoir autant de procédures faisant essentiellement la même chose.

0
amn

Utilisez OutputDebugString au lieu de afxDump.

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("[...]"));
}
0
Maurizio TALPO