2011-12-12 24 views
5

में साथ आउटपुट को दबाकर मैं एक साझा लाइब्रेरी का उपयोग कर रहा हूं जिसका कार्य हर जगह std :: cout कर रहा है। कॉलर स्तर पर कुछ भी करना संभव है जिसमें मैं कोउट आउटआउट को दबा सकता हूं या इसे किसी स्थान पर रीडायरेक्ट कर सकता हूं?फ़ंक्शन

क्या सी ++ में ऐसी चीज का प्रयास करना भी संभव है।

+2

मैंने पहले और साझा लाइब्रेरी में प्रत्येक कॉल के बाद आप कर सकते थे [freopen] (http://www.cplusplus.com/reference/clibrary/cstdio/freopen/) 'stdout' लगता है। प्रदर्शन और थ्रेडिंग आपकी आवश्यकताओं के आधार पर चिंता का विषय हो सकता है। – Joe

+1

उदाहरण के लिए, आप फ़ाइल को आउटपुट रीडायरेक्ट करने के लिए 'std :: cout.rdbuf()' का उपयोग कर सकते हैं। – lapk

+0

इसके अलावा यह साझा लाइब्रेरी ऐसा नहीं लगता है कि यह वाणिज्यिक गुणवत्ता का है। अगर आपके पास इस लाइब्रेरी के लिए स्रोत कोड है तो आपको लॉगिंग अक्षम के साथ इसे पुन: संकलित करना चाहिए। एक जिम्मेदार लाइब्रेरी प्रीप्रोसेसर परिभाषा का उपयोग करके एक ही स्थान पर होने की अनुमति देगी। – Joe

उत्तर

4

ऐसा कुछ, बस अपनी लाइब्रेरी कॉल के लिए फ़ंक्शन रैपर बनाएं जो cout को रीडायरेक्ट करेगा।

int main(void) 
{ 
std::ofstream lStream("garbage.txt"); 
std::streambuf* lBufferOld = std::cout.rdbuf(); 

std::cout.rdbuf(lStream.rdbuf()); 
std::cout << "Calling library function" << std::endl; 

std::cout.rdbuf(lBufferOld); 
std::cout << "Normal output" << std::endl; 

std::cout.rdbuf(lStream.rdbuf()); 
std::cout << "Calling another library function" << std::endl; 

std::cout.rdbuf(lBufferOld); 
std::cout << "Another normal output" << std::endl; 

lStream.close(); 

return (0); 
} 
+1

rdbuf और फ्रीपेन का उपयोग करने के बीच कोई प्रदर्शन अंतर है? कौन सा बेहतर दृष्टिकोण होगा? – Jithin

+0

@ जिथिन मेरी समझ यह थी कि प्रत्येक लाइब्रेरी फ़ंक्शन कॉल से पहले, केवल एक बार नहीं, 'cout' को पुनर्निर्देशित करने की आवश्यकता है। उस स्थिति में 'rdbuf() 'सबसे तेज़ है, मुझे लगता है, - यह फ़ाइल खोलने के बाद, बस एक सूचक सेट करता है। यदि 'cout' को केवल एक बार पुनर्निर्देशित करने की आवश्यकता है, तो दोनों तरीकों (' rdbuf' या 'freopen') अनिवार्य रूप से वही हैं। – lapk

0

आप आउटपुट को संभालने के लिए कक्षा बनाकर हमेशा सभी I/O फ़िल्टर कर सकते हैं। कक्षा को एप्लिकेशन-व्यापी का उपयोग किया जा सकता है, एक स्थिर वर्ग क्रम में हो सकता है, लेकिन आप आवश्यकतानुसार कक्षा के उदाहरण को तुरंत चालू कर सकते हैं।

तर्क लिखने के आधार पर कुछ लिखने या यहां तक ​​कि एक अलग आउटपुट चुनने के अलावा, कक्षा भी चुने गए आउटपुट के प्रकार के आधार पर पाठ को प्रारूपित कर सकती है।

मैंने ostream पर देखा और ऑफहैंड को सीधे सीओटी को संशोधित करने का कोई तरीका नहीं देखा। आपको पहले की आवश्यकता की आवश्यकता है, इसलिए उम्मीद है कि इसे पढ़ने वाले किसी और व्यक्ति के पास सुझाए गए वर्ग को बनाने पर बेहतर विचार हो सकते हैं।