Làm cách nào để ghi vào cửa sổ Output trong Visual Studio?


79

Tôi nên sử dụng chức năng nào để xuất văn bản ra cửa sổ "Đầu ra" trong Visual Studio?

Tôi đã thử printf()nhưng nó không hiển thị.

Câu trả lời:


84

Hàm OutputDebugString sẽ làm việc đó.

mã ví dụ

    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
Vẫn có một vấn đề với điều này. _vsnprintf có thể cắt ngắn chuỗi được định dạng để vừa với bộ đệm, nhưng nếu điều này xảy ra thì chuỗi sẽ không bị kết thúc bằng nul. Xem msdn.microsoft.com/en-us/library/1kt27hek.aspxstackoverflow.com/questions/357068 .
ChrisN

Bạn đang sử dụng bộ ký tự multibyte trong các tùy chọn trình biên dịch của mình. Sau đó bạn cần phải sử dụng các phiên bản multibyte củaWCHAR szBuff[1024] _vsnwprintf
Lefteris E

Cảnh báo 1 cảnh báo C4996: '_vsnwprintf': Hàm hoặc biến này có thể không an toàn. Hãy xem xét sử dụng _vsnwprintf_s thay thế. ;-)
hfrmobile

1
Tôi có cần #include thứ gì đó để OutputDebugString hoạt động không?
Michele

bao gồm Windows.h
ΦXocę 웃 Пepeúpa ツ

72

Nếu điều này là để gỡ lỗi đầu ra thì OutputDebugString là những gì bạn muốn. Một macro hữu ích:

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

Điều này cho phép bạn nói những điều như:

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

Bạn có thể mở rộng điều này bằng cách sử dụng __LINE____FILE__macro để cung cấp thêm thông tin.

Đối với những người trong Windows và vùng đất ký tự rộng:

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

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

1
Bạn có thể giải thích câu nói này một chút không? - "Bạn có thể mở rộng điều này bằng cách sử dụng macro LINEFILE để cung cấp thêm thông tin."
Yousuf Azad

2
@ sami1592 hai macro đó được trình biên dịch xác định là dòng và tệp (bất ngờ), vì vậy bạn có thể xuất các bản ghi hữu ích hơn chứa dòng và tệp một cách tự động.
ZachB

20

Sử dụng OutputDebugStringhàm hoặc TRACEmacro (MFC) cho phép bạn thực hiện printfđịnh dạng theo kiểu:

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 );

Trình biên dịch của tôi trong Visual Studio không nhận dạng ALTTRACE2 hoặc ALTTRACE. Tôi có cần # bao gồm thứ gì đó không? Có phải vì nó không phải là một dự án MFC? Nó chỉ là c ++ đối với tôi.
Michele

Tôi đang thử nghiệm thuật toán 3DES cũ trong Visual Studio 2017, C ++. Tôi nhận được mã hoạt động bằng cách thay thế tất cả "printf" thành "TRACE". Đánh rất tốt! Cảm ơn bạn!
Paul

3

Mẹo hữu ích - nếu bạn sử dụng __FILE____LINE__sau đó định dạng gỡ lỗi của bạn thành:

"file(line): Your output here"

thì khi bạn nhấp vào dòng đó trong cửa sổ xuất, Visual Studio sẽ chuyển trực tiếp đến dòng mã đó. Một ví dụ:

#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)

Tôi đã viết một bài đăng trên blog về điều này để tôi luôn biết mình có thể tra cứu nó ở đâu: https://windowscecleaner.blogspot.co.nz/2013/04/debug-output-tricks-for-visual-studio.html


0

Sử dụng OutputDebugString thay vì afxDump.

Thí dụ:

#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
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

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

#include <string>
Andrew

0

Mặc dù OutputDebugStringthực sự in một chuỗi ký tự vào bảng điều khiển trình gỡ lỗi, nó không hoàn toàn giống như printfviệc sau này có thể định dạng các đối số bằng cách sử dụng %ký hiệu và một số đối số thay đổi, điều gì đó OutputDebugStringkhông làm được.

Tôi sẽ đưa ra trường hợp rằng _RPTFNmacro, với _CRT_WARNđối số ít nhất, là phù hợp hơn trong trường hợp này - nó định dạng chuỗi chính giống như printf, ghi kết quả vào bảng điều khiển trình gỡ lỗi.

Người chưa thành niên (và kỳ lạ, theo ý kiến của tôi) báo trước với nó là nó đòi hỏi ít nhất một đối số sau chuỗi định dạng (một với tất cả các %sử dụng quyền thay), một giới hạn printfnào không bị ảnh hưởng từ.

Đối với các trường hợp bạn cần một putschức năng tương tự - không cần định dạng, chỉ cần viết chuỗi như hiện tại - đó là anh chị em của nó _RPTF0(bỏ qua các đối số theo sau chuỗi định dạng, một cảnh báo kỳ lạ khác). Hoặc OutputDebugStringtất nhiên.

Và nhân tiện, cũng có tất cả mọi thứ từ _RPT1đến _RPT5nhưng tôi chưa thử chúng. Thành thật mà nói, tôi không hiểu tại sao cung cấp quá nhiều thủ tục về cơ bản lại làm cùng một thứ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.