2014-09-02 2 views
0

, 그것은 ... 나는 등 디버깅 목적으로, 자세한 내용은 << 운용자 피드 정보를 가진 - 수 있도록 여러 스트림을 가지고하는 것이 좋습니다 것투명하게 추상화 iostream 인터페이스 특정 프로그램에 대한

점 여기서 모든 스트림은 최종 사용자가 파일이나 스트림을 통해 텍스트를 제공하는 방식을 변경하지 않고 네트워크 또는 표준 출력을 통해 파일에 쓰는 것이 가능하다는 것입니다.

이 솔루션을 구현하면 실행 중에 프로그램이 스트리밍에서 표준 출력으로 (예 : 명령 줄 인수를 통해) 런타임이나 시작시 파일로 전환 될 수 있습니다.

이 방법을 가장 잘 수행 할 수 있습니까?

+2

IOSTREAMS는 추상적 인 인터페이스, 즉 그들이 위해 설계되었습니다 정확히 무슨 *입니다 *. – user657267

+0

@ user657267 그래서 어떻게 런타임 코드에서 stdout으로 파일을 쓰거나 end 코드의 단일 심볼에'<<'연산자를 사용하면됩니까? – Mario

+0

@Alec 스트림의 기본 버퍼를 대상 스트림의 버퍼로 변경할 수 있습니다. –

답변

1

당신은 목표 출력 스트림을 가리 키도록 내부 std::streambuf 포인터를 변경할 수 있습니다

std::streambuf* p = std::cerr.rdbuf(nullptr); 
o.rdbuf(p); 

// Do what you want with the output stream o which now has std::cerr.rdbuf() 

// Reset 
std::cerr.rdbuf(p); 
+0

@Alec'std :: ostream o (nullptr); ' –

+0

명확한 답변 덕분에 모든 것이 필요했습니다. – Mario

1

<< 연산자가 정의되어있는 경우 원하는 경우 #define 키워드를 사용할 수 있습니다. 예를 들어 : - 물론이 캔, 헤더에 포함 당신이 그들을 사용하기 전에 포함 장소를 제공 할

ofstream myLogFile("/path/to/my/logFile"); 
#define Info std::cout 
#define Err std::cerr 
#define Log myLogFile 

Info << "Send this message to cout" << std::endl; 
Err << "Send this message to cerr" << std::endl; 
Log << "Send this message to my logfile at /path/to/my/logFile" << std::endl; 

나는 이것이 당신이 원하는하는지 생각합니다. 이 경우 항상 그렇듯이 #ifndef 스타일 포함 가드가 좋습니다.

물론 다른 용도로 사용하려는 유혹을 불러 일으키지 않는 단어를 선택하지 마십시오.

+0

당신의 솔루션은 훌륭하게 작동하지만 제 경우에는 런타임이나 시작시 "백엔드"를 전환 할 수 있어야합니다. 예를 들어, Info stream 출력을 파일로 지정하는 경우에만, stdout과 같은 명령으로 지정하십시오. – Mario

+0

아, 알겠습니다. 그럼 당신은 래퍼 클래스로 더 나아지겠습니까? 나는 그런 종류의 구현을 두 번째 대답으로 게시하기 시작했지만, 최소한의 예제를 아주 잘 컴파일 할 수는 없었다. 더 큰 프로젝트를위한 몇 가지 예제 소스 코드에 대한 링크는 다음과 같습니다 : http://www.openfoam.org/docs/cpp/ - "Pout"및 "Perr"또는 "Sout", "Serr" . 이것들은 당신에게 아이디어를 주지만, 웹 사이트는 압도적으로 쉽게 탐색 할 수 없습니다. – chrisb2244