C言語において時刻取得を以下のようにプログラムしたら、プログラムを3回目以上実行すると前回時間内容が常に1回目が表示されてしまいます。どこを直せばちゃんと前回の時刻が正しく表示されるようになるのでしょうか。put()のfopenの"a"の部分は"w"に変えるだけで正しく実行されるのですが、これを"a"にした場合について正しく表示されるようにするということです。
#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);
}
}
No.1ベストアンサー
- 回答日時:
出力ファイルにあるデータは 増えても構わないのであれば
get関数の fscanfを ループして最後まで読み込んでしまえばいいでしょう
do {
fsacnf(fp, "%d %d %d", &h, &m, &s);
} while ( !feof(fp) );
最後の行を読み込んで もう一度読み込もうした場合fscanfは失敗し
次の whileでループを終了します
出力ファイルに 常にデータが2行なら 出力する前に最後行(2行目)のデータを読み出して
2行とも出力しなおすといった具合になるでしょう
No.3
- 回答日時:
No.2
- 回答日時:
fopen(data_file,"a")
"a"ではファイルdata_fileの最終行の後に追加書き込みをしているので、
void get(void)で1行目だけを読み込んでいるのを < ここが問題
最終行から読み込むように変更する必要があります。
なのでvoid get(void)の
fscanf(fp, "%d %d %d", &h, &m, &s);
を細かい処理は省略し大まかにはこんな感じに変更します。
char buffer[100];
while(fgets(buffer,100,fp) != NULL){} /* 最終行をさがす */
sscanf(buffer, "%d %d %d", &h, &m, &s);
fopen(data_file,"w")で成功しているのは、既存のファイルに常に同じ名前のファイルを上書きしているので、1行目=最終行となっているためです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語でファイル読み書きを早く...
-
c言語でのfscanfについて
-
構造体のメンバにファイルポイ...
-
fscanfでループしてしまう。
-
テキストファイル内に対して, ...
-
エラーがわかりません、、
-
ファイルからCR/LFを除去したい
-
C言語を用いて、csvファイル内...
-
辞書順にソートしたいのですが...
-
C言語の課題です
-
C言語
-
_popen() のエラー取得
-
[C言語]2つのファイルを用いた...
-
ファイルが読み込めない・・・
-
ファイルに行番号を追加
-
main関数の中をスッキリさせたくて
-
ファイルへの書込み処理が異常...
-
fopenでファイル名に、変数を使...
-
乱数とファイルの入出力の質問...
-
test.csvの内容
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数ファイルの同時読み込みの...
-
ファイルへの書込み処理が異常...
-
C言語でファイル読み書きを早く...
-
c言語でのfscanfについて
-
fopenでファイル名に、変数を使...
-
ファイル出力で改行を入れたい!
-
C言語にてXMLファイルから任意...
-
CRC32の計算方法
-
fgets( ) の返り値は何?
-
InternetReadFileを使ったファ...
-
【C言語】ファイルを読み込んで...
-
VisualStudioでのファイルの入...
-
commons-netでのFTP送信について
-
日本語ファイル名のFTPについて
-
fgets関数の利用 c言語
-
C言語でコマンドmvを実行
-
「コマンドライン引数チェック...
-
C言語でセグメンテーションエ...
-
構造体のメンバにファイルポイ...
-
エラー C2664
おすすめ情報