2011-12-29 4 views
2

나는 현재 날짜와 시간을 인쇄해야하는 간단한 로그 기능을 가지고 있습니다. 나는 char *을 반환하는 함수 내에서이 작업을 수행하고 있습니다. 이 char *fprintf()으로 설정하려고하면 파일에 문자열이 출력되지 않습니다. 이유는 무엇입니까?fprintf가 const char *를 파일에 인쇄하지 않습니다.

const char *time =__TIME__; // compilation time 
char *currentTime = UT::CurrentDateTime(); // it's a static method; also tried to set it to const 
fprintf(fp, "%s %s %s %s %s %d %s\n", __TIME__, pType, __DATE__, 
     currentTime, pFileName, lineNo, pMsg.c_str()); 
fflush(fp); 

모든 일이 날짜/시간 char *를 제외하고 인쇄 : 여기

char * UT::CurrentDateTime() 
{ 
    char buffer [50]; 
    time_t t = time(0); // get time now 
    struct tm * now = localtime(& t); 
    int n=sprintf(buffer, "%d:%d:%d %d:%d:%d:", (now->tm_year + 1900), 
        (now->tm_mon + 1), now->tm_mday, now->tm_hour, now->tm_min, 
        now->tm_sec); 
    return buffer; 
} 

로그입니다 : 여기

는 날짜 - 시간을 구성하는 기능입니다. 왜?

+0

C++ 컴파일러로 C 코드를 작성하는 대신 _embrace_ C++을 사용해야합니다. C++은 문자열 (및 파일 출력)에 형식화 된 출력을하는 방법 (C++의 관점에서 보면 더 좋습니다) - 예를 들어'stringstream'을보십시오. – paxdiablo

+0

'struct tm'에서 날짜/시간 값을 포맷하기 위해'strftime()'사용을 고려하십시오. 또한, 'const char * time' 변수는 사용되지 않아 유익하지 않을 것입니다. 드물게 모든 로그 메시지에 컴파일 날짜와 시간을 기록해야합니다. 제품의 어떤 v 전이 로그에 기록되는지를 기록하기 위해 로그를 열 때 한 x 수행 할 수 있습니다. –

답변

5
char * UT::CurrentDateTime() 
{ 
    char buffer [50]; 
    /* ... */ 
    return buffer; 
} 

즉시 죽는 메모리 버퍼에 대한 포인터를 반환했습니다. CurrentDateTime()에서 반환 된 포인터를 사용하는 함수는 garbage에 의존합니다.

컴파일러에서 경고해야합니다. 컴파일러 경고는 무시하십시오.

대신 char *buffer = malloc(50 * sizeof char);을 통해 할당하거나 C++의 메모리 할당 메커니즘을 사용하여 함수가 '실행 중이며 실행되고있는 시간보다 오래있을 수있는 메모리를 할당하십시오.

+0

감사합니다. 감사합니다! – user63898

+1

Hehehe, 그것은 내가 본 가장 열정적 인 반응이다. :) 감사! – sarnold

+0

메신저를 사용할 때마다 삭제해야합니까? 또는 함수의 마지막에? – user63898

관련 문제