विज़ुअल स्टूडियो में "आउटपुट" विंडो में टेक्स्ट को आउटपुट करने के लिए मुझे किस फ़ंक्शन का उपयोग करना चाहिए?
मैंने कोशिश की printf()
लेकिन यह नहीं दिखा।
जवाबों:
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);
}
WCHAR szBuff[1024]
_vsnwprintf
यदि यह डीबग आउटपुट के लिए है, तो 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() ); \
}
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 );
उपयोगी टिप - यदि आप उपयोग करते हैं __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
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("[...]"));
}
हालांकि, OutputDebugString
वास्तव में डिबगर कंसोल के लिए वर्णों की एक स्ट्रिंग प्रिंट करता है, यह बिल्कुल ऐसा नहीं है printf
कि उत्तरार्द्ध के बारे में %
नोटेशन और तर्कों की एक चर संख्या का उपयोग करके तर्क को प्रारूपित करने में सक्षम हो , कुछOutputDebugString
नहीं करता है।
मैं यह मामला _RPTFN
बनाऊंगा कि मैक्रो, _CRT_WARN
कम से कम तर्क के साथ , इस मामले में एक बेहतर suitor है - यह प्रिंसिपल स्ट्रिंग को बहुत पसंद करता है printf
, जो डिबगर कंसोल को परिणाम लिखता है।
एक छोटी सी (और अजीब, मेरी राय में) इसके साथ चेतावनी है कि यह आवश्यकता है कम से कम एक तर्क प्रारूप स्ट्रिंग (के साथ सभी एक निम्नलिखित %
, एक सीमा प्रतिस्थापन के लिए) printf
है नहीं से ग्रस्त हैं।
ऐसे मामलों के लिए जहां आपको एक puts
कार्यक्षमता की आवश्यकता होती है - कोई स्वरूपण नहीं, बस स्ट्रिंग को इस रूप में लिख रहा है - इसका सिबलिंग है _RPTF0
(जो प्रारूप स्ट्रिंग के बाद के तर्कों की उपेक्षा करता है, एक और अजीब चेतावनी)। याOutputDebugString
बेशक।
और वैसे, वहाँ से भी सब कुछ है _RPT1
, _RPT5
लेकिन मैंने उन्हें कोशिश नहीं की है। ईमानदारी से, मुझे समझ में नहीं आता है कि सभी प्रक्रियाओं को अनिवार्य रूप से एक ही काम करने के लिए क्यों प्रदान करें।