2011-11-23 3 views
17

cout 또는 cerr으로 경고 메시지를 인쇄하는 라이브러리를 사용하고 있습니다. 이 경고 메시지가 내 프로그램의 출력에 도달하기를 원하지 않습니다. 이 출력을 어떻게 받아 들여 /dev/null 또는 그 유사 물에 넣을 수 있습니까?함수 출력을/dev/null로 리디렉션

MWE : 출력은해야

#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

), 전화하기 전에 리디렉션 할 수 있습니다.

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 : 당신이 그 일을 (내가 생각하지 않는 (표준 아웃 다시 할 것이다, /dev/tty/에 예) 출력을 리디렉션하지 않도록 경우

#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; 
}