2011-08-07 8 views
5

아래의 코드는 stdout을 fname 파일 &으로 리디렉션하여 원래 stdout으로 다시 리디렉션합니다. 그것은 나를 위해 잘 작동합니다. 그러나 실제로 작동하는 방식을 이해할 수 없습니다. 누군가 내가 이해할 수있게 도와 준다면 나는 그것을 이해할 것이다.이 stdout 리디렉션은 어떻게 작동합니까?

printf("\n This is console"); 
    fflush(stdout); 
    fgetpos(stdout, &pos); 
    fd = dup(fileno(stdout)); 
    freopen(fname, "a+", stdout); 

    printf("inside file op"); 

    fflush(stdout); 
    dup2(fd,fileno(stdout)); 
    close(fd); 
    clearerr(stdout); 
    fsetpos(stdout, &pos); 
    printf("\nBack to Console"); 
+0

그래, 그걸 복사해라. 명심하십시오. 고마워요 :) – vindyz

+2

위의 신들의 신들, 왜 누구가하고 싶습니까? (stdout에 쓰는 것을 주장하는 소스가없는 라이브러리에 대한 절망적 인 최후의 해결 방법 인 것 말고도). –

+0

누군가 다른 로그 메시지를 다른 파일로 리디렉션하여 디버깅 목적으로 사용하려면 매우 편리합니다. – vindyz

답변

14

의 라인으로 라인을 그것을 통해 가자. stdout에 첫 번째 줄을 인쇄 일 :

printf("\n This is console"); 

그럼 그렇게 버퍼에 남아있는 모든 데이터가 stdout로 전송됩니다 stdout를 플러시하고 파일 데이터와 혼동하지 않습니다

fflush(stdout); 

이제 우리는 stdout에 현재 위치를 저장합니다. 그렇지 않으면 stdout이 이미 파일로 지정된 경우 (?) 이전 부분을 덮어 쓸 수 있기 때문입니다.

fgetpos(stdout, &pos); 

이제는 stdout 인 파일 설명자를 복제합니다.

freopen(fname, "a+", stdout); 
: 우리가 파일로 stdout을 다시 열 수 있습니다, 우리는 모든 것을 보존 한 이제

fd = dup(fileno(stdout)); 

: 우리가 어디 stdout 포인트를 변경하려합니다 때문에, 우리는 원본의 사본을 보관해야

이 시점에서 stdout이 파일로 리디렉션되었습니다. 이제 인쇄 할 수 있습니다 :

printf("inside file op"); 

이제 인쇄가 완료되었습니다. 우리는 stdout (현재 파일)을 세척 할 필요가 그래서 정상적인 stdout 데이터와 혼합되지 않습니다

fflush(stdout); 

는 그 후, 우리는 현재 stdout 설명을 통해 원래 stdout 파일 기술자를 복제.

dup2(fd,fileno(stdout)); 

복제 된 사람은 지금은 폐쇄 할 수 있습니다

close(fd); 

나는이 여기 왜 확실치 않지만이 파일에 쓰기가 발생했습니다 오류 웁니다

clearerr(stdout); 

이제 우리의 위치가 stdout으로 복원됩니다. 그것은 원래의 파일로 리디렉션 된 경우 다시 말하지만, 내가 아는 한, 이것은 단지 유용

fsetpos(stdout, &pos); 

이제 우리는 원래 stdout 다시, 그래서 우리는 다시 인쇄 할 수 있습니다

printf("\nBack to Console"); 
+0

소리가 좋아 .. 지금은 훨씬 더 분명해. 고마워요. . 매우 상세한 답변은 – vindyz

+0

+1입니다. – templatetypedef

+0

에는 다른 방법이 있습니다. 더 효율적일 수 있습니다 .. – vindyz

관련 문제