【问题标题】:fprintf doesn't print const char * to filefprintf 不打印 const char * 到文件
【发布时间】:2012-01-29 16:11:46
【问题描述】:

我有一个简单的日志功能,需要打印当前日期和时间。我在返回char * 的函数中执行此操作。当我尝试将此char * 设置为fprintf() 时,它不会将字符串打印到文件中:为什么?

这是构造日期时间的函数:

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 * 外,所有内容都会被打印。 为什么?

【问题讨论】:

  • 你应该拥抱 C++,而不是仅仅用C++编译器编写C代码。 C++ 有更好的(在 C++ 方面更好)的方式来对字符串(和文件输出)进行格式化输出 - 例如,请参见 stringstream
  • 考虑使用strftime() 格式化来自struct tm 的日期/时间值。此外,“const char *time”变量未使用,不太可能有益。您很少需要在每条日志消息中记录编译日期和时间;您可以在打开日志时执行一次,以记录正在写入日志的产品版本。

标签: char printf localtime


【解决方案1】:
char * UT::CurrentDateTime()
{
     char buffer [50];
     /* ... */
     return buffer;
}

您返回了一个指向立即终止的内存缓冲区的指针。任何使用从CurrentDateTime() 返回的指针的函数都依赖于garbage

你的编译器应该已经警告你了。忽略编译器警告,后果自负。

相反,要么通过char *buffer = malloc(50 * sizeof char); 分配它,要么使用 C++ 的内存分配机制来分配内存,该内存可以比函数“活动”和运行的时间更长。

【讨论】:

  • 嘿嘿嘿,这是我见过最热情的回应了。 :) 谢谢!
  • 每次使用时都需要删除吗?还是在函数的末尾?
  • 如果您的函数分配并返回内存,则调用代码负责释放它。另一种设计是调用代码将缓冲区(及其大小)传递给函数,然后函数写入该缓冲区。同样,如果需要删除(释放)缓冲区,则调用函数将其删除。 OTOH,调用函数很可能会传递一个不需要显式内存管理的局部变量。
  • 所以如果我在我的方法中理解正确,调用函数需要删除从 CurrentDateTime 方法返回的 char*,如下所示: char* foo = CurrentDateTime(); ...做东西...; free(foo) 还是删除 foo ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多