2011-03-09 99 views
3

我想打开每个程序运行的新日志文件,因此我使用当前时间创建了一个文件名。boost :: posix_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"); 

我还是很好奇,为什么前两个版本在发布版本中失败,但在调试工作。

回答

4

好吧我有点晚,但是当我自己寻找答案时偶然发现了问题(day_clock :: local_day()在编译为Release时出现奇怪的结果,这里是Win XP + Boost 1.46), 我以为我应该回来为我工作。

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

所以我的解决办法就是零出最上面的16位:

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

,而不是说:

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

,它很适合我呢。

Valmond

+0

谢谢,这看起来很有趣。我现在正在处理其他事情,但我会尽力回到测试您的解决方法。 – ravenspoint 2011-06-17 13:48:12

+0

解决方法有效。 – ravenspoint 2011-06-19 16:12:50

+0

有没有办法可以将这个通知给增强开发者?该错误仍然存​​在,在提升1.48! – scippie 2012-02-17 14:57:53