2012-06-08 2 views
4

printf을 수정하여 콘솔이 아닌 파일에 문자열을 출력 할 수 있습니까?C printf()를 수정하여 파일로 출력

나는 인터넷에서 무엇인가 올려다 보았는데 이것과 관련된 dup, dup2fflush과 같은 전화를 발견했다.

편집 :

어쩌면 내가 분명하지 않다 .. 물건이는 C의 시험 문제 있다는 것입니다 ... 질문은 다음과 같다 :

가 어떻게 프로그램이 정상적으로 출력 문자열 설명 화면 ( printf() 사용)은 문자열을 파일 에 출력하고을 언급 된 프로그램의 코드를 변경하지 않고 만들 수 있습니다.

+0

* 왜 * 아주 이상한 일을하고 싶은지 설명하면 일반적으로 답이 좋을 것입니다. – unwind

+3

'fprintf'는 어떻습니까? 또는 쉘 리다이렉션 ('./myprogram> some_file')을 사용하고 있습니까? –

+0

@JoachimPileborg ... 답을 주셔서 감사합니다. 쉘 리디렉션 옵션을 더 자세히 살펴 보겠습니다. – user1317277

답변

5

이것은 일반적으로 I/O 리디렉션 (...> 파일)을 통해 수행됩니다.

확인이 작은 프로그램 :

#include <stdio.h> 
#include <unistd.h> 

int main (int argc, char *argv[]) { 
    if (isatty (fileno (stdout))) 
     fprintf (stderr, "output goes to terminal\n"); 
    else 
     fprintf (stderr, "output goes to file\n"); 

    return 0; 
} 

[email protected]:~ $ ./x 
output goes to terminal 
[email protected]:~ $ ./x >yy 
output goes to file 
1

sprintf을 사용하여 문자열에 쓰고 파일에 쓰거나 fprintf을 직접 입력하십시오. 그러나, 해킹에

stdout = freopen("my_log.txt", "w", stdout); 

이 국경 : 인쇄를 수행하는 소스 코드를 수정할 수있는 자유가없는 경우

http://linux.die.net/man/3/fprintf

+1

'snprintf'는 버퍼 오버 플로우를 피하기 위해'sprintf'보다 항상 더 나은 선택입니다. –

+0

@DelanAzabani 동의합니다. 그냥 단순하게 유지하고 싶었습니다. – user1202136

11

, 당신은 파일로 리디렉션 stdoutfreopen을 사용할 수 있습니다 명령 줄 리디렉션이 예상대로 작동하지 않기 때문입니다. 인쇄 작업을 수행하는 코드에 액세스하는 경우 fprintf을 사용하는 것이 좋습니다.

또한 전환 할 수 stdout 일시적으로 함수 호출 한 다음 다시 넣어 :

FILE *saved = stdout; 
stdout = fopen("log.txt", "a"); 
call_function_that_prints_to_stdout(); 
fclose(stdout); 
stdout = saved; 
+0

이렇게하면 stdout은 겹쳐 쓰여지고 콘솔보다는 파일로 출력됩니다. – user1317277

+0

또한 어떻게 printf print를 다시 콘솔로 만드나요? – user1317277

+1

@ user1317277 예,'stdout'을 'freopen'하면 출력은 파일로갑니다. 'freopen' 후에 되돌릴 수는 없지만, 오래된 stdout을 저장하고 내가 편집에서 설명한 방식으로 되돌릴 수 있습니다. – dasblinkenlight

2

다른 답변은 어떤 코드를 변경하지 않는 문제에 대처하지 않습니다.

따라서 환경에 따라 남은 유일한 것은 프로그램을 호출 할 때 표준 출력 방향 전환입니다.

./program > target_file 
+0

우수한 .. 감사합니다 :) – user1317277

1

이 강사는 상담이는 (강사 혼자서)에서 제공하는 올바른 해결책이었다 : dup2가 뒤에

int main { 
    int newFile = open(desiredFilePath, O_WRONLY) 
    if ((fork())==0) { 
     dup2(newFile,stdout) // Explained below 
     close newFile 
     Set stdout as CLOSE_ON_EXEC false 
     exec the user program 
    } 
    else{ 
     Wait for child 
    } 
    return 0 
} 

논리 : 여기에 표준 출력이 설정되어 newFile의 사본으로, FD0이 이제는 콘솔이 아닌 실제로 사용자가 필요한 파일이라는 의미입니다. 이는 dup 2의 기본 동작이 두 번째 매개 변수의 filedescriptor를 닫고 첫 번째 매개 변수에 할당하기 때문입니다.

관련 문제