0

2000 年以降の合計日数を計算するプログラムにシステム日付を含めようとしています。さまざまな日付 (ウイルス対策の更新日、OS の更新日など) の値を比較して、システム更新の遅れ。Cで日付を見つける手順は私を殺していたので、システムコマンドを使用して現在の日付を見つけました。

    system("date/t > system_date.txt");

このファイルから日付を読み取りたい。日付がすべて数字の場合 (例: 03/09/13) は問題ありませんでした。しかし、DOS から表示される日付のタイプは 03-Sep-13 です。次のように sscanf を使用する場合:

    FILE *fp_date=fopen("system_date.txt","r");
    char buffer[11];   int day,yr;   char yr[3];
    fgets(buffer,11,fp_date);
    sscanf("%d-??????-%d",&day,&mon,&yr);

これらをデータ型で個別にスキャンするにはどうすればよいでしょうか。??????の代わりに何を使えばいいのかわからない。または、私が使用している他の方法は、行全体を配列に格納し、for ループを実行して「-」で区切られた要素を取得することです。しかし、私はもう少し洗練されたいと思っていました。ありがとう...

4

3 に答える 3

3

必要ありませんsystemdateコマンドも必要ありません)。ところで、使用popen("date","r")する方が簡単かもしれませんが、それでも正しい方法ではありません。

time(7)の man ページを最初に読んでください。

次に、次のようなコードを使用します

  time_t now=0;
  time (&now);
  struct tm* ltm = localtime(&now);

time(2)システムコールは、Unixエポック(1970 年の開始) からの時間を秒単位で提供します。さらに精度が必要な場合 (または CPU やスレッドの時間を測定する場合) は、 clock_gettime(2)を使用します。gettimeofday(2)は廃止されつつあります。localtime(3)は、Unix 時間を、struct tm秒、分、... 曜日、月日、月、.... フィールドに変換します。aから a へmktimeの反対の変換に使用します。また、他の関数または syscalls によっても提供されます (変更時刻を含むファイルに関するメタデータを提供するstat(2)など)。struct tmtime_ttime_t

秒、分、....月 (1 月は 0 など) などのltmように、プログラムでフィールドを使用できます。ltm->tm_secltm->tm_minltm->tm_mon

文字列が必要な場合は、次のように strftime(3) を使用します

  char timebuf[32];
  strftime (timebuf, sizeof(timbuf), "%d %b %Y", ltm);

反対の関数は、文字列を に解析するstrptime(3)struct tmです。

strftimeローカリゼーションを使用することに注意してください (最初にlocale(7)を参照してください)。%bしたがって、ユーザーは(システムがフランス語にローカライズされている場合)からフランス語の省略形の月を取得できます。

世界標準時 (いわゆる GMT) が必要な場合は、gmtime代わりに を使用しlocaltimeます。マルチスレッド プログラムではlocaltime_r、a、dgmtime_rを使用し、独自のstruct tm.

于 2013-09-03T05:38:57.853 に答える
2

これをしないでください。C で現在の日付/時刻を取得するのは簡単です。

#include <time.h>
/* ... */
struct tm *tm = localtime(time(0));

あなたがやろうとしている方法は、エラーが発生しやすいことは言うまでもなく、はるかに困難です。(たとえば、2 つのインスタンスが同時に実行され、両方が同じファイルに書き込もうとするとどうなりますか?) 一般に、system何かを行うには常に間違った方法です。

于 2013-09-03T05:38:33.937 に答える
2

そうしないでください。time(2)(C89) またはgettimeofday(3)(POSIX) を使用して、現在のシステム時刻をUnix 時刻形式で取得します。それを文字列表現やオブジェクトなどの他の形式に変換する必要がある場合は、 、struct tmなどのさまざまな変換関数を使用できます。ctime(3)gtime(3)localtime(3)

#include <time.h>

time_t now = time(NULL);
printf("The current time is: %s\n", ctime(&now));  // Warning: not thread-safe

struct tm *now_tm = localtime(now);  // Warning: not thread-safe
printf("Year=%d month=%d day=%d\n hour=%d minute=%d second=%d",
       1900 + now_tm->tm_year,
       1 + now_tm->tm_mon,
       now_tm->tm_mday,
       now_tm->tm_hour,
       now_tm->tm_min,
       now_tm->tm_sec);
于 2013-09-03T05:38:56.760 に答える