web-dev-qa-db-ja.com

Visual Studioの出力ウィンドウに書き込む方法は?

Visual Studioの「出力」ウィンドウにテキストを出力するには、どの関数を使用する必要がありますか?

printf()を試しましたが、表示されません。

73
clamp

OutputDebugString 関数が実行します。

サンプルコード

    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);
}
78
Sorantis

これがデバッグ出力用の場合、 OutputDebugString が必要です。便利なマクロ:

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

これにより、次のようなことを言うことができます。

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

__LINE__および__FILE__マクロを使用してこれを拡張し、さらに多くの情報を提供できます。

Windowsおよびワイドキャラクターランドの場合:

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

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

OutputDebugString 関数または TRACE マクロ(MFC)を使用して、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

役に立つヒント-__FILE____LINE__を使用する場合、デバッグを次のようにフォーマットします。

"file(line): Your output here"

次に、出力ウィンドウでその行をクリックすると、Visual Studioはそのコード行に直接ジャンプします。例:

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

void DBOut(const char *file, const int line, const WCHAR *s)
{
    std::wostringstream os_;
    os_ << file << "(" << line << "): ";
    os_ << s;
    OutputDebugStringW(os_.str().c_str());
}

#define DBOUT(s)       DBOut(__FILE__, __LINE__, s)

これについてのブログ記事を書いたので、どこで検索できるかを常に知っていました: https://windowscecleaner.blogspot.co.nz/2013/04/debug-output-tricks-for-visual-studio。 html

3
parsley72
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

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

OutputDebugString は実際にデバッガコンソールに文字列を出力しますが、後者はprintfとは異なり、後者は_%_表記と可変数の引数を使用して引数をフォーマットできます、OutputDebugStringにはありません。

少なくとも__RPTFN_引数を持つ __CRT_WARN_ マクロは、この場合により適していると判断します-それは、printfのように主要な文字列をフォーマットします。デバッガーコンソールへの結果。

それに関するマイナーな(そして奇妙なことに、私の意見では)警告は、フォーマット文字列(置換のためのすべての_%_を持つもの)に続く少なくとも1つの引数を必要とすることです、制限printfnotに苦しむ。

putsのような機能が必要な場合(フォーマットせず、文字列をそのまま記述する)には、その兄弟__RPTF0_があります(フォーマット文字列に続く引数を無視します、別の奇妙な警告)。またはもちろんOutputDebugString

ところで、__RPT1_から__RPT5_までのすべてがありますが、私はそれらを試していません。正直なところ、なぜ多くの手順がすべて同じことを本質的に行うのかを理解できません。

0
amn

AfxDumpの代わりにOutputDebugStringを使用します。

例:

#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