2011-03-09 87 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