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.
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);
}
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() ); \
}
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 );
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
wstring outputMe = L"can" + L" concatenate\n";
OutputDebugString(outputMe.c_str());
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.
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("[...]"));
}