boost :: posix_time在发布版本中失败

时间:2011-03-09 19:22:38

标签: boost-date-time

我想在每个程序运行时打开一个新的日志文件,所以我用当前时间创建一个文件名。

FILE * fplog;

void OpenLog()
{
    boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
    char buf[256];
    sprintf(buf,"ecrew%d%02d%02d_%02d%02d%02d.log",
        now.date().year(),now.date().month(),now.date().day(),
        now.time_of_day().hours(),now.time_of_day().minutes(),now.time_of_day().seconds()); 
    fplog = fopen(buf,"w");

}

这在调试版本中非常有效,可以生成名称如

的文件
ecrew20110309_141506.log

然而,相同的代码在发布版本中奇怪地失败

ecrew198619589827196617_141338.log
顺便说一句,这也以同样的方式失败:

boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
char buf[256];

boost::gregorian::date day (boost::gregorian::day_clock::local_day());

sprintf(buf,"ecrew%d%02d%02d_%02d%02d%02d.log",
    day.year(),day.month(),day.day(),
now.time_of_day().hours(),now.time_of_day().minutes(),now.time_of_day().seconds()); 

fplog = fopen(buf,"w");

这有效:

boost::posix_time::ptime now = boost::posix_time::second_clock::local_time();
char buf[256];
sprintf(buf,"ecrew%s_%02d%02d%02d.log",
    to_iso_string( boost::gregorian::day_clock::local_day() ).c_str(),
    now.time_of_day().hours(),now.time_of_day().minutes(),now.time_of_day().seconds()); 
fplog = fopen(buf,"w");

我仍然很好奇为什么前两个版本在发布版本中失败,但在debug中工作。

1 个答案:

答案 0 :(得分:4)

好吧我有点迟了但是当我在寻找答案时偶然发现你的问题(day_clock :: local_day()在编译为Release时出现了奇怪的结果,在Win XP + Boost 1.46上这里, 我想我应该回来看看对我有用的东西。

数据似乎是以16位的方式存储(我只是使用年,月和日)但是当你读它们时你得到一个32位整数,无论​​有什么错误,它都会将垃圾写入顶部位或它在写入较低字节之前不会清除它们。

所以我的解决方法是将最顶端的16位清零:

date todaysdate(day_clock::local_day());
int year = todaysdate.year() & 0xFFFF;

而不是说:

date todaysdate(day_clock::local_day());
int year = todaysdate.year();

无论如何它对我来说都很好。

Valmond