2011-11-23 58 views
17

Tôi đang sử dụng thư viện đang in thông báo cảnh báo tới cout hoặc cerr. Tôi không muốn thông báo cảnh báo này đến được đầu ra của chương trình của tôi. Làm thế nào tôi có thể bắt đầu ra này và đặt nó vào /dev/null hoặc tương tự?Đầu ra chức năng chuyển hướng đến/dev/null

MWe:

#include <iostream> 

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

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

Sản lượng nên là:

Interesting message. 

Làm thế nào tôi nên sửa đổi main để có được những kết quả mong muốn? (foo không được thay đổi.)


tôi đã cố gắng sử dụng freopen()fclose(stdout) như đề xuất trong câu hỏi này How can I redirect stdout to some visible display in a Windows Application?. Kết quả là không có gì được in.

Trả lời

15

Nếu bạn chắc chắn điều đó không chuyển hướng đầu ra (ví dụ như để /dev/tty/, đó sẽ là tiêu chuẩn ra trở lại) (mà tôi không nghĩ rằng), bạn có thể chuyển hướng trước khi gọi cho họ.

#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

Tôi có thể đề xuất hack không? Đặt bit xấu/lỗi trên luồng có liên quan trước khi sử dụng chức năng thư viện.

#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

Cảm ơn bạn đã làm việc này, tuy nhiên, tôi đã quyết định đánh dấu câu trả lời khác là câu trả lời được chấp nhận. – Unapiedra

+1

Cảm ơn @Unapiedra. Cách cư xử luôn được đánh giá cao :) – wreckgar23

+1

Tôi có thể đề nghị lưu trạng thái hiện tại thông qua 'rdstate' và sau đó đặt lại nó về sau đó không? Đó là một chút an toàn hơn thanh toán bù trừ trạng thái của luồng. – SirGuy

4

Sử dụng 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; 
} 
Các vấn đề liên quan