2011-11-23 16 views
17

मैं एक लाइब्रेरी का उपयोग कर रहा हूं जो cout या cerr पर चेतावनी संदेश प्रिंट कर रहा है। मैं नहीं चाहता कि यह चेतावनी संदेश मेरे कार्यक्रम के आउटपुट तक पहुंच जाए। मैं इस आउटपुट को कैसे पकड़ सकता हूं और इसे /dev/null या इसी तरह रख सकता हूं?फ़ंक्शन आउटपुट को रीडायरेक्ट करना/dev/null

मेगावाट:

#include <iostream> 

void foo() 
{ 
    std::cout << "Boring message. " << std::endl; 
}; 

int main() 
{ 
    foo(); 
    std::cout << "Interesting message." << std::endl; 
    return 0; 
} 

उत्पादन किया जाना चाहिए:

Interesting message. 

मैं main कैसे को संशोधित करना चाहिए वांछित आउटपुट प्राप्त करने के लिए? (foo बदल नहीं किया जाना चाहिए।)


मैं के रूप में इस सवाल का How can I redirect stdout to some visible display in a Windows Application? में सुझाव दिया freopen() और fclose(stdout) उपयोग करने की कोशिश। नतीजा यह है कि कुछ भी मुद्रित नहीं है।

उत्तर

15

आप यह सुनिश्चित करें कि बात (/dev/tty/ को जैसे, जो मानक से बाहर फिर से होगा) उत्पादन रीडायरेक्ट नहीं करता है (जो मुझे नहीं लगता कि कर रहे हैं), आप उन्हें कॉल करने से पहले रीडायरेक्ट कर सकते हैं।

#include <iostream> 
#include <sstream> 

void foobar() { std::cout << "foobar!\nfrob!!"; } 

int main() {  
    using namespace std; 

    streambuf *old = cout.rdbuf(); // <-- save   
    stringstream ss; 

    cout.rdbuf (ss.rdbuf());  // <-- redirect 
    foobar();      // <-- call 
    cout.rdbuf (old);    // <-- restore 

    // test 
    cout << "[[" << ss.str() << "]]" << endl; 
} 
18

क्या मैं एक हैक सुझा सकता हूं? लाइब्रेरी फ़ंक्शन के उपयोग से पहले प्रासंगिक स्ट्रीम पर खराब/असफल बिट सेट करें।

#include <iostream> 

void foo() 
{ 
    std::cout << "Boring message. " << std::endl; 
} 

int main() 
{ 
    std::cout.setstate(std::ios::failbit) ; 
    foo(); 
    std::cout.clear() ; 
    std::cout << "Interesting message." << std::endl; 
    return 0; 
} 
+1

हालांकि, यह काम आपको धन्यवाद, मैंने दूसरे उत्तर को स्वीकार किए गए उत्तर के रूप में चिह्नित करने का निर्णय लिया है। – Unapiedra

+1

धन्यवाद @Unapiedra। शिष्टाचार हमेशा सराहना की :) – wreckgar23

+1

क्या मैं वर्तमान स्थिति को 'rdstate' के माध्यम से सहेजने का सुझाव दे सकता हूं और उसके बाद इसे बाद में रीसेट कर सकता हूं? स्ट्रीम की स्थिति को साफ़ करने से यह थोड़ा सा सुरक्षित है। – SirGuy

4

उपयोग ios :: rdbuf:

#include <iostream> 

void foo() 
{ 
    std::cout << "Boring message. " << std::endl; 
} 

int main() 
{ 
    ofstream file("/dev/null"); 

    //save cout stream buffer 
    streambuf* strm_buffer = cout.rdbuf(); 

    // redirect cout to /dev/null 
    cout.rdbuf(file.rdbuf()); 

    foo(); 

    // restore cout stream buffer 
    cout.rdbuf (strm_buffer); 

    std::cout << "Interesting message." << std::endl; 
    return 0; 
} 
संबंधित मुद्दे