2012-06-19 3 views
7

funcA에서 funcB 함수를 호출합니다. funcB은 여러 개의 printf 문을 사용하여 데이터를 출력합니다. funcA을 통해 해당 데이터를 캡처 할 수있는 방법이 있습니까? funcB을 수정할 수 없습니다.printf의 출력을 캡처하는 방법은 무엇입니까?

funcB(){ 
    printf("%s", "My Name is"); 
    printf("%s", "I like ice cream"); 
} 

funcA(){ 
    funcB(); 
} 
+2

'funcB'가 출력물을 출력하지 않으면 대신'funcA'로 반환하겠습니까? 당신이 제공 한 추상적 인 묘사에서 말하기는 좀 더 구체적입니다. – LihO

+2

* "이것은 C++ 질문입니다."* - C 질문과 비슷합니다. C++이라면 다음과 같이 할 수 있습니다 : [this] (http://stackoverflow.com/a/8076948/168175). – Flexo

+0

내 답변에서 언급 한 것처럼 OS에 특유한 질문처럼 보입니다. –

답변

10

이 답변은 POSIX 중심입니다. freopen을 사용하여 stdout을 파일로 리디렉션 할 수 있습니다. 그러나 STDOUT_FILENO 전에 dup을 입력해야 stdout을 원래 상태 인 fdopen으로 복원 할 수 있습니다.

int stdout_fd = dup(STDOUT_FILENO); 
freopen(redirected_filename, "w", stdout); 
funcB(); 
fclose(stdout); 
dup2(stdout_fd, STDOUT_FILENO); 
stdout = fdopen(STDOUT_FILENO, "w"); 
close(stdout_fd); 

C++ 스트림의 경우, 당신은 Johnathan Wakely's answer를 사용할 수 있습니다. 당신은 당신이 '훔칠'수 printf에 끼워 더러운 게임을하고자하는 경우

+0

당신은 규칙 친구, 그게 효과가! – Gene

0

funcB을 별도의 프로그램에 넣습니다. 그러면 표준 출력을 캡처 할 수 있습니다. 파이핑 또는 파일로 리다이렉트함으로써. 이를 수행하는 방법은 일반적으로 OS에 따라 다르며 C++의 영역 밖에 있습니다.

또는 funcA 프로세스의 표준 출력을 파일로 리디렉션 한 다음 FuncB을 호출하고 파일에서 출력을 검색 할 수 있습니다.

이 작업을 다시 수행하는 방법은 C++ 영역 밖이며 OS에 따라 다릅니다.

1

프로그램의 다른 항목이 printf 인 경우 사용자가 직접 작성하여 명시 적으로 연결할 수 있습니다. 함수가 이미 정의되어 있으면 링커에서 표준 라이브러리를 찾지 않습니다. 구현시 vsprintf을 사용하거나 컴파일러에서 제공 한 경우 오버런 검사가 포함 된 좀 더 안전한 버전을 사용할 수 있습니다.

1

같은 일을 출력 : 당신은 플래그를 사용할 수

#include <stdio.h> 
#include <stdarg.h> 

static char buffer[1024]; 
static char *next = buffer; 

static void funcB(){ 
    printf("%s", "My Name is"); 
    printf("%s", "I like ice cream"); 
} 

static void funcA(){ 
    funcB(); 
    // Do stuff iwth buffer here 
    fprintf(stderr, "stole: %s\n", buffer); 
    next=buffer; // reset for later. 
} 

int main() { 
    funcA(); 
} 


int printf(const char *fmt, ...) { 
    va_list argp; 
    va_start(argp, fmt); 
    const int ret = vsnprintf(next, sizeof buffer-(next-buffer), fmt, argp); 
    next += ret; 
    va_end(argp); 
    return ret; 
} 

원하는 인스턴스를 처리하는 방법을 나타냅니다 printf가 정상적으로 작동합니다. 예 : fprintf에 매핑하거나 dlsym()/유사 전화 번호를 사용하여 실제 통화를 찾습니다.

또한 realloc을 사용하여 버퍼 크기를보다 효율적으로 관리 할 수 ​​있습니다.

관련 문제