5

誰かが助けてくれることを願っています。私は、ずっと前に書かれた誰かの C コードの問題を修正しています。

このコードは、特定のファイルのタイムスタンプを出力します。コードは Windows で実行すると正常に動作しますが、Linux で実行すると年が正しく表示されません。Linux では年が表示されず、35222 と表示されます。

ありがとう

ウィンドウ出力:

Source file: test.dtl, Created: Mon, 27 May, 2013 at 16:13:20

Linux 出力:

Source file: test.dtl, Created: Mon, 27 May, 35222 at 16:13:20

C コードの関数:

void SummaryReport ( report_t *report, char *dtlName)
{      
       LogEntry(L"SummaryReport entry\n");

       int                  i;
       wchar_t              *rootStrType,*localStr,timeStr[48];
       wchar_t              fileBuff[64];

       struct tm *timeVals;
       timeVals = localtime (&logHdr.date);
       wcsftime (timeStr,47,L"%a, %#d %b, %Y at %X",timeVals);

       /*  Print the header information  */
       DisplayReportFile (report);
       ReportEntry (report,L" Filesystem Audit Summary Report\n\n");
       ReportEntry (report,L"Source file: %s, Created: %ls\n\n",dtlName,timeStr);
       ReportEntry (report,L"Server: %ls",srvrName);
…
}
4

2 に答える 2

1

wcsftime()それ自体が を呼び出す場合はlocaltime()、呼び出しの結果が破損していないことを確認してください。

struct tm timeVals;
timeVals = *localtime (&logHdr.date);
wcsftime (timeStr,47,L"%a, %#d %b, %Y at %X", &timeVals);

localtime()その結果を static struct tm のどこかに保存します。その場所へのアドレス (ポインタ) が返されます。構造体 tmへの後続の呼び出し localtime()または変更。gmtime()への呼び出しがwcsftime()Linux で間接的にそれを行うと思われます。

ところで: localtime() は NULL を返す可能性があるため、より安全なコードは localtime() の戻り値をチェックします。

あなたは調べたいと思うかもしれませんlocaltime_s()

于 2013-06-28T21:09:15.160 に答える
1

最小限の例で検証され、「うまくいく」。これは正しい時間を示していますか?

#include <wchar.h>
#include <time.h>


int main() {
        wchar_t timeStr[48];
        struct tm *timeVals;
        time_t now = time(NULL);
        timeVals = localtime(&now);
        wcsftime(timeStr, 47, L"%a, %#d %b, %Y at %X", timeVals);
        wprintf(timeStr);
        return 0;
}

はいの場合は、ファイル自体を確認してください。ファイルシステムを共有している場合は、ファイルのタイムスタンプ自体に奇妙な問題があるのではないでしょうか? (またはfsメタデータを理解した上で)

于 2013-06-28T18:48:57.833 に答える