2010-06-08 3 views
2

64 비트 앱을 빌드하기 위해 VS2008로 업그레이드 할 일부 오래된 VC6.0 코드를 상속 받았습니다. 길고 오래 전에 구현 된 하나의 필수 기능은 std :: cout을 오버라이드하므로 콘솔 창과 파일에 동시에 출력됩니다. 구현은 당시 ostream의 VC98 라이브러리 구현에 의존했으며 물론 현재는 VS2008을 통해 완전히 복구 할 수 없습니다. 프로그램 종료 시간까지 모든 출력을 누적 한 다음 파일에 덤프하는 것이 합리적입니다. freopen(), setvbuf() 및 ios :: sync_with_stdio()를 사용하여 집으로 돌아가는 길을 가졌지 만, 당황 스럽지만 내부 라이브러리는 해당 버퍼를 링 버퍼로 취급하지 않습니다. 대신 출력 장치로 플러시 할 때 처음에 다시 시작되므로 모든 누적 된 출력이 누적 된 모든 출력을 지 웁니다. 더 표준 로깅 기능으로 변환하는 것은 바람직하지 않습니다. 거의 60 개의 파일에 "std :: cout < <"이 흩어져 있기 때문에 바람직하지 않습니다. ostream의 연산자를 재정의하는 것으로 생각했습니다. < < 함수가 있지만 전역 연산자가 있기 때문에 덮어 쓰게 될지 잘 모르겠습니다. < < 함수를 재정의 할 수 없습니다. (또는 그럴 수 있습니까?)내부 "티"설정

이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

답변

3

coutcout.rdbuf()으로 사용자 정의 스트림 버퍼를 쓸 수 있습니다. 사용자 지정 스트림 버퍼는 데이터를 cout의 원래 스트림 버퍼와 적절히 도난당한 스트림 버퍼로 티핑합니다. ofstream.

ofstream flog("log.txt"); 
teebuf tb(flog.rdbuf(), cout.rdbuf()); 
cout.rdbuf(&tb); 

티밍 스트림 버퍼의 경우 영감을 얻을 수 있습니다 this page.

+0

예, 유망 해 보입니다. 그것이 나를 위해 일하면 나는 곧 알아야한다. 감사. – RadlyEel

+0

그게 작동합니다. 나는 당신에게 "UP"응답을주기에 충분한 순위가 없지만, 고맙습니다. – RadlyEel

-1

당신은 전처리 사용할 수 있습니다

#define cout MyLogger 

새로운 코드를 삽입 할 수 있습니다.

+0

연산자 오버로드 옵션의 변형입니다. MyLogger는 ostream 유형이어야하므로 모든 기존 std :: cout << 사용법이 작동하고 "ostream & operator << (ostream & out, char c)와 같은 전역 연산자 << 기능에 대한 질문이 열립니다. ; " 나는 그에게 가야 만하는 것을 끝낼지도 모른다. 그러나 만일 당신이 나의 표류를 얻으면, ostream 클래스를 reimplementing하는 것이 나의 계획 위에 없었다! – RadlyEel

+0

정의되지 않은 심볼'std :: MyLogger', 나는 두려워합니다. – MSalters