3

プログラムが実行されるたびに新しいログ ファイルを開きたいので、現在の時刻でファイル名を作成します。

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");

前の 2 つのバージョンがリリース ビルドでは失敗するのに、デバッグでは機能する理由が今でも気になります。

4

1 に答える 1

4

わかりました少し遅れましたが、自分で答えを探しているときにあなたの質問に出くわしたので ( day_clock::local_day() はリリースとしてコンパイルされたときに奇妙な結果をもたらします、ここでは 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();

とにかく私にとってはうまくいきます。

ヴァルモンド

于 2011-06-16T12:36:27.290 に答える