掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.30405

時刻取得について
投稿者---sayoi(2007/06/29 13:40:07)


C言語において、時刻取得を以下のようにプログラムしたら、プログラムを3回目以上実行すると前回時間内容が常に1回目が表示されてしまいます。どこを直せばちゃんと前回の時刻が正しく表示されるようになるのでしょうか。
#include  <time.h>
#include  <stdio.h>

void get(void);
void put(void);
char data_file[] = "time.dat";
int main(void)
{
    get();  
    put(); 
    return(0);
}
/*   前回の日付・時刻を読込む   */
void get(void)
{
    FILE  *fp;
    time_t     t;
    struct tm  *local;

    time(&t);
    local = localtime(&t);

    if ((fp = fopen(data_file, "r")) == NULL){        
        printf("\a本プログラムを実行するのは初めて\n");
    }else {
        int year, month, day, h, m, s;
        fscanf(fp, "%d %d %d", &h, &m, &s); 
        printf("前回は%d時%d分%d秒\n", h, m, s);
        fclose(fp);                                  
    }
}

/*   今回の日付・時刻を書き込む   */
void put(void)
{
    FILE  *fp;
    time_t     t;
    struct tm  *local;

    time(&t);
    local = localtime(&t);

    if ((fp = fopen(data_file, "a")) == NULL)         
        printf("\aファイルをオープンできません。\n");
    else {
        printf("現在の日付・時刻を書き出しました。\n");
        fprintf(fp, "%d %d %d\n",
            local->tm_hour,     local->tm_min,      local->tm_sec  );
        fclose(fp);          
    }
}



環境
OS:Windows XP
コンパイラ:Microsoft Visual C++


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:時刻取得について 30406 bugs 2007/06/29 14:36:58


No.30406

Re:時刻取得について
投稿者---bugs(2007/06/29 14:36:58)


> if ((fp = fopen(data_file, "a")) == NULL)

ファイルのオープンモードが「追加書き込み」になっているためです。
put()では、時刻を取得するたびに
ファイルの1行目、2行目、3行目、...に書き込んでいます。
それに対し、get()では常に1行目を読み込むようになっています。

もし、ファイルに書き込むデータが最新の時刻情報だけでよいのなら、
put()でのファイルオープンモードを"w"にしてください。


この投稿にコメントする

削除パスワード

No.30407

Re:時刻取得について
投稿者---bugs(2007/06/29 14:40:45)


もし、取得した時刻をすべてファイルの中に
持っておきたいのなら、get()でファイルを読むとき、
先頭行ではなく最終行を読む必要があります。


この投稿にコメントする

削除パスワード

No.30410

Re:時刻取得について
投稿者---sayoi(2007/06/29 18:06:37)


>先頭行ではなく最終行を読む必要があります。
最終行を読むためにはどのようにプログラムを修正したらいいですか?


この投稿にコメントする

削除パスワード

No.30411

Re:時刻取得について
投稿者---bugs(2007/06/29 21:39:55)


>最終行を読むためにはどのようにプログラムを修正したらいいですか?

例えば、while文によるループを使って、
fscanf()で時分秒を正しく読めている間は読み飛ばす、
という方法があります。

ところで、本題とは離れますが、使っていない変数の定義は
削除する方がよいと思います。


この投稿にコメントする

削除パスワード

No.30413

Re:時刻取得について
投稿者---sayoi(2007/06/30 01:34:44)


>fscanf()で時分秒を正しく読めている間は読み飛ばす
正しく読めている間は読み飛ばすというのは具体的にどのように表記したらいいのでしょうか。


この投稿にコメントする

削除パスワード

No.30414

Re:時刻取得について
投稿者---bugs(2007/06/30 05:47:40)


get()の

>         fscanf(fp, "%d %d %d", &h, &m, &s); 

ここを、

         while(fscanf(fp, "%d %d %d", &h, &m, &s) == 3)
             ;

とすればよいと思います。
fscanf()でファイルを読んで、時・分・秒の3つのデータを
取得できている間、何もしない、という意味です。
時分秒のデータを取得できなくなったら、つまりファイルを最後まで読んだら
while文のループから抜けます。
このとき、変数h, m, sのそれぞれに入っている値は、
最後に正しく取得できたとき、つまり最終行を読んだときの値です。

お試しになってみてください。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧