मैं एक सी ++ सांत्वना एप्लिकेशन बनाया है और सिर्फ विजुअल स्टूडियो 2005 आईडीई के भीतर आउटपुट विंडो में अदालत/cerr बयान पर कब्जा करना चाहते हैं। मुझे यकीन है कि यह सिर्फ एक सेटिंग है जिसे मैं याद कर रहा हूं। क्या कोई मुझे सही दिशा दिखा सकता है?विजुअल स्टूडियो 2005 आउटपुट विंडो में कैटर कैप्चरिंग?
उत्तर
आप ऐसा नहीं कर सकते।
यदि आप डीबगर की आउटपुट विंडो में आउटपुट करना चाहते हैं, तो आउटपुटडिबगस्ट्रिंग को कॉल करें।
मैं एक 'teestream' जो एक उत्पादन कई धाराओं में जाने के लिए अनुमति देता है की this implementation पाया। आप एक स्ट्रीम को कार्यान्वित कर सकते हैं जो आउटपुटडिबगस्ट्रिंग को डेटा भेजता है।
क्या यह आउटपुट स्क्रीन का सिर्फ एक मामला चमक रहा है और फिर गायब हो रहा है? यदि ऐसा है तो आप रिटर्न का उपयोग करके अपने अंतिम बयान के रूप में इसे इस्तेमाल करके इसे खोल सकते हैं।
नहीं, आप ऐसा नहीं कर सकते क्योंकि अपने आप को सिने का मूल्यांकन करने का कोई प्रभाव नहीं पड़ता है। – ben
आप इस तरह अदालत के उत्पादन पर कब्जा कर सकते हैं, उदाहरण के लिए:
std::streambuf* old_rdbuf = std::cout.rdbuf();
std::stringbuf new_rdbuf;
// replace default output buffer with string buffer
std::cout.rdbuf(&new_rdbuf);
// write to new buffer, make sure to flush at the end
std::cout << "hello, world" << std::endl;
std::string s(new_rdbuf.str());
// restore the default buffer before destroying the new one
std::cout.rdbuf(old_rdbuf);
// show that the data actually went somewhere
std::cout << s.size() << ": " << s;
विजुअल स्टूडियो 2005 उत्पादन विंडो में Magicking एक दृश्य स्टूडियो 2005 प्लगइन डेवलपर के लिए एक व्यायाम के रूप में छोड़ दिया जाता है। लेकिन आप शायद इसे कहीं और रीडायरेक्ट कर सकते हैं, जैसे फ़ाइल या कस्टम विंडो, शायद एक कस्टम स्ट्रीमबफ क्लास लिखकर (boost.iostream भी देखें)।
कोई प्लगइन की आवश्यकता नहीं है, बस माइक Dimmick द्वारा उल्लिखित आउटपुटडिबगस्ट्रिंग का उपयोग करें। – jwfearn
बेन के जवाब और माइक Dimmick के का एक संयोजन: यदि आप एक stream_buf_ कि OutputDebugString बुला समाप्त होता है को लागू करने की जाएगी। शायद किसी ने यह पहले से ही किया है? दो प्रस्तावित बूस्ट लॉगिंग पुस्तकालयों पर नज़र डालें।
ऐसा लगता है: http://www.codeproject.com/KB/debug/debugout.aspx – wimh
इसके अलावा, अपने इरादों, और किन लायब्रेरी के प्रयोग कर रहे हैं पर निर्भर करता है, तो आप उपयोग कर सकते हैं TRACE macro (MFC) या ATLTRACE (ATL)।
मैं अंत में इस क्रियान्वित किया है, इसलिए मैं इसे आपके साथ साझा करना चाहते हैं:
#include <vector>
#include <iostream>
#include <windows.h>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/tee.hpp>
using namespace std;
namespace io = boost::iostreams;
struct DebugSink
{
typedef char char_type;
typedef io::sink_tag category;
std::vector<char> _vec;
std::streamsize write(const char *s, std::streamsize n)
{
_vec.assign(s, s+n);
_vec.push_back(0); // we must null-terminate for WINAPI
OutputDebugStringA(&_vec[0]);
return n;
}
};
int main()
{
typedef io::tee_device<DebugSink, std::streambuf> TeeDevice;
TeeDevice device(DebugSink(), *cout.rdbuf());
io::stream_buffer<TeeDevice> buf(device);
cout.rdbuf(&buf);
cout << "hello world!\n";
cout.flush(); // you may need to flush in some circumstances
}
बोनस टिप: यदि आप लिखना:
X:\full\file\name.txt(10) : message
उत्पादन खिड़की और फिर डबल करने के लिए - उस पर क्लिक करें, फिर विजुअल स्टूडियो दी गई फ़ाइल, लाइन 10 पर कूद जाएगा, और स्टेटस बार में 'संदेश' प्रदर्शित करेगा। यह बहुत उपयोगी है।
यह मेरे लिए वास्तव में अच्छा काम कर रहा है, लेकिन वीएस2013 और बूस्ट 1.57 के साथ यह बूस्ट कोड में एक दावा विफलता के साथ दुर्घटनाग्रस्त हो गया है जैसे ही स्ट्रीम फ़्लश हो जाती है, या तो बहुत प्रिंट करके या स्ट्रीम में 'std :: endl' भेजकर, तो यह अब उपयोग करने योग्य नहीं है :-(यह सुनिश्चित नहीं है कि यह बूस्ट या क्या है। – Malvineous
-1, गलत। बेन का जवाब देखें। – MSalters