2011-12-29 18 views
2

私は現在の日付と時刻を出力する必要のある簡単なログ機能を持っています。私はchar *を返す関数の中でそれをやっています。 char *fprintf()に設定しようとすると、文字列がファイルに出力されません。なぜですか?ここでfprintfはconst char *をファイルに出力しません

は日時を構築する機能である:ここでは

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 *日を除いて印刷されます。 なぜですか?

+0

C++コンパイラでCコードを書くのではなく、C++を_embrace_する必要があります。書式設定された出力を文字列(およびファイル出力)にする方法はC++の方が優れています(例えばC++の方が良い) - 例えば 'stringstream'を参照してください。 – paxdiablo

+0

'struct tm'から日付/時刻の値をフォーマットするには' strftime() 'を使うことを検討してください。また、 'const char * time'変数は使用されておらず、有益ではありません。ログメッセージごとにコンパイル日時を記録することはめったにありません。製品のどのバージョンをログに書き込んでいるかを記録するために、ログを開いたときに一度行うことがあります。 –

答えて

5
char * UT::CurrentDateTime() 
{ 
    char buffer [50]; 
    /* ... */ 
    return buffer; 
} 

直ちに終了するメモリバッファへのポインタを返しました。 CurrentDateTime()から返されたポインタを使用する関数はすべてgarbageに依存しています。

あなたのコンパイラは、これについて警告する必要があります。あなた自身の危険であなたのコンパイラ警告を無視してください。

代わりにchar *buffer = malloc(50 * sizeof char);経由で割り当てるか、C++のメモリ割り当てメカニズムを使用して、関数が「実行中」実行されている時間より長く存続するメモリを割り当てます。

+0

ありがとう、ありがとう! – user63898

+1

Hehehe、それは私がまだ見た中で最も熱狂的な反応です。 :)ありがとう! – sarnold

+0

私はそれを使用して毎回それを削除する必要がありますか? または機能の最後に? – user63898

関連する問題