2009-11-19 3 views
5

코드 내에 C++ 출력을 리디렉션 할 수 있습니까? 상황은 이것입니다, 나는 콘솔에 경고를하기 위해 printf를 사용하는 외부의 .cpp와 .h 파일을 사용하고 있습니다. 이 출력 (광산 아님)을 "수정하지 않고"자신의 코드를 수정하지 않고 파일로 리디렉션하고 싶습니다.C++ 리디렉션 출력

그래서; 내 프로그램에서 출력을 파일로 리디렉션 할 수 있으며 출력을 다시 기본 콘솔로 보내면 다시 출력 할 수 있습니다.

가능합니까?

답변

7

stdout에서 freopen()을 사용하여 stdout을 파일로 리디렉션 할 수 있습니다.

+0

+1 표준 호환 (및 휴대용) 일을하고있다. – DevSolar

+0

그것은 프로그램의 끝까지 여하튼 permament입니까? 어떻게 든 다시 콘솔에 넣으려면 다시 변환해야합니까? –

1

printf는 파일 설명자 1로 인쇄합니다. 파일을 닫고 파일을 열 수 있습니다.이 파일은 다른 fd를 제공합니다. 가능한 한 가장 낮은 fd를 사용할 수 있기 때문에 1 일 수도 있습니다.

단지 close(1); 인 경우 int fd = open(file); fd는 아무 것도 닫히지 않고 열 때 아무 것도 열지 않으면 1이어야합니다. 그 시점에서 fd 번호 1로 출력하는 사람은 누구나 파일에 인쇄 할 것입니다.

시스템이 lowest available file descriptor number을 제공해야하기 때문에 이것은 printf가 쓰는 곳인 정확하게 1을 줄 것입니다.

@roe는 dd()를 먼저 사용하여 stdout으로 인쇄 할 수있는 다른 fd 번호를 얻는 것을 선호합니다.

+0

당신이 stdout에 자신의 물건을 계속 인쇄하고 싶다면 먼저 그것을 dup()해야합니다. 원하는 경우'dup2()'를 사용하여 앞뒤로 전환 할 수 있습니다. – falstro

+0

또는 자신의 데이터를 직접 속여 fd에 쓰십시오 ... 나는 그것이 더 좋을 것이라고 생각합니다. 여전히 그것을 dup 할 필요가있다. – falstro

+0

물론 POSIX 시스템을 가정하면 reopen()이 법안에 완벽하게 부합하는 잠재적으로 위험한 일을합니다. C 라이브러리 과 POSIX 은 잘 섞이지 않습니다. 나는 항상 open()/read()/write()/close()와 fopen()/fread()/fwrite()/fclose()를 분리하여 유지할 것이다. – DevSolar