2011-12-29 124 views
2

我有一个简单的日志功能,需要打印当前的日期和时间。我正在做一个返回char *的函数。当我尝试将char *设置为fprintf()时,它不会将字符串打印到文件中:为什么?fprintf不打印const 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; 
} 

这里是日志:

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 *。 为什么?

+0

您应该_embrace_ C++,而不是用C++编译器编写C代码。无论如何,C++都有更好的方法(以C++方式来说更好),以格式化输出到字符串(和文件输出) - 例如参见'stringstream'。 – paxdiablo 2011-12-29 06:16:54

+0

考虑使用'strftime()'来格式化来自'struct tm'的日期/时间值。此外,'const char * time'变量未被使用,不太可能有益。您很少需要在每条日志消息中记录编译日期和时间;您可以在打开日志时记录一次,以记录产品的哪个版本正在写入日志。 – 2011-12-29 08:05:46

回答

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

您已经返回了指向内存缓冲区的指针,该指针立即死亡。任何使用从CurrentDateTime()返回的指针的函数都依赖于garbage

您的编译器应该已经向您发出警告。在你自己的危险中忽略你的编译器警告。

相反,要么通过char *buffer = malloc(50 * sizeof char);分配这个值,要么使用C++的内存分配机制来分配比活动时间更长的内存。

+0

谢谢谢谢谢谢! – user63898 2011-12-29 06:35:02

+1

呵呵呵,那是我见过的最热烈的回应。 :) 谢谢! – sarnold 2011-12-29 06:42:08

+0

我是否需要每次使用它时删除它? 还是在函数的结尾? – user63898 2011-12-29 06:58:48