Visual Studio में आउटपुट विंडो कैसे लिखें?


79

विज़ुअल स्टूडियो में "आउटपुट" विंडो में टेक्स्ट को आउटपुट करने के लिए मुझे किस फ़ंक्शन का उपयोग करना चाहिए?

मैंने कोशिश की printf()लेकिन यह नहीं दिखा।

जवाबों:


84

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

3
इसके साथ अभी भी एक समस्या है। _vnnprintf बफर फिट करने के लिए स्वरूपित स्ट्रिंग को छोटा कर सकता है, लेकिन यदि ऐसा होता है तो स्ट्रिंग को शून्य-समाप्त नहीं किया जाएगा। Msdn.microsoft.com/en-us/library/1kt27hek.aspx और stackoverflow.com/questions/357068 देखें ।
क्रिस एनएल

आप अपने संकलक विकल्पों में सेट मल्टीबाइट चरित्र का उपयोग कर रहे हैं। फिर आपको WCHAR szBuff[1024] _vsnwprintf
Lefteris E

चेतावनी 1 चेतावनी C4996: '_vsnwprintf': यह फ़ंक्शन या चर असुरक्षित हो सकता है। इसके बजाय _vsnwprintf_s का उपयोग करने पर विचार करें। ;-)
hfrmobile

1
क्या मुझे OutputDebugString को काम में लाने के लिए कुछ करने की आवश्यकता है?
मिशेल


72

यदि यह डीबग आउटपुट के लिए है, तो 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() );  \
}

1
क्या आप इस कथन को थोड़ा समझा सकते हैं? - " और भी अधिक जानकारी देने के लिए आप LINE और FILE मैक्रोज़ का उपयोग करके इसे बढ़ा सकते हैं ।"
यूसुफ आजाद

2
@ sami1592 उन दो मैक्रोज़ को कंपाइलर द्वारा सरप्राइज़ (आश्चर्यचकित) लाइन और फ़ाइल के रूप में परिभाषित किया गया है, जिससे आप अधिक उपयोगी लॉग को लाइन और फ़ाइल को स्वचालित रूप से आउटपुट कर सकते हैं।
ZachB

20

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

Visual Studio में मेरा कंपाइलर ALTTRACE2 या ALTTRACE को नहीं पहचान रहा है। क्या मुझे कुछ करने की आवश्यकता है? क्या ऐसा इसलिए है क्योंकि यह MFC प्रोजेक्ट नहीं है? यह मेरे लिए सिर्फ सी ++ है।
मिशेल से

मैं Visual Studio 2017, C ++ में एक पुराने 3DES एल्गोरिथ्म का परीक्षण कर रहा था। मुझे "TRACE" के सभी "प्रिंटफ़" को बदलकर कोड काम करने लगा। बहुत अच्छी हिट! धन्यवाद!
पॉल

3

उपयोगी टिप - यदि आप उपयोग करते हैं __FILE__और __LINE__फिर अपने डिबग को इस रूप में प्रारूपित करते हैं:

"file(line): Your output here"

फिर जब आप आउटपुट विंडो में उस लाइन पर क्लिक करेंगे तो विजुअल स्टूडियो सीधे कोड की उस लाइन पर कूद जाएगा। एक उदाहरण:

#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


0

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

हालांकि, OutputDebugStringवास्तव में डिबगर कंसोल के लिए वर्णों की एक स्ट्रिंग प्रिंट करता है, यह बिल्कुल ऐसा नहीं है printfकि उत्तरार्द्ध के बारे में %नोटेशन और तर्कों की एक चर संख्या का उपयोग करके तर्क को प्रारूपित करने में सक्षम हो , कुछOutputDebugString नहीं करता है।

मैं यह मामला _RPTFNबनाऊंगा कि मैक्रो, _CRT_WARNकम से कम तर्क के साथ , इस मामले में एक बेहतर suitor है - यह प्रिंसिपल स्ट्रिंग को बहुत पसंद करता है printf, जो डिबगर कंसोल को परिणाम लिखता है।

एक छोटी सी (और अजीब, मेरी राय में) इसके साथ चेतावनी है कि यह आवश्यकता है कम से कम एक तर्क प्रारूप स्ट्रिंग (के साथ सभी एक निम्नलिखित %, एक सीमा प्रतिस्थापन के लिए) printfहै नहीं से ग्रस्त हैं।

ऐसे मामलों के लिए जहां आपको एक putsकार्यक्षमता की आवश्यकता होती है - कोई स्वरूपण नहीं, बस स्ट्रिंग को इस रूप में लिख रहा है - इसका सिबलिंग है _RPTF0(जो प्रारूप स्ट्रिंग के बाद के तर्कों की उपेक्षा करता है, एक और अजीब चेतावनी)। याOutputDebugString बेशक।

और वैसे, वहाँ से भी सब कुछ है _RPT1, _RPT5लेकिन मैंने उन्हें कोशिश नहीं की है। ईमानदारी से, मुझे समझ में नहीं आता है कि सभी प्रक्रियाओं को अनिवार्य रूप से एक ही काम करने के लिए क्यों प्रदान करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.