プログラミングについて質問
現在、ストップウォッチの機能をもつプログラムを拡張して出力結果をテキストファイルに書き出すプログラムを作っているのですが、どうしても最後だけの「終了」部分のタイマーだけしかテキストファイルに書き出せません。(ストップウォッチの機能自体は完成しています)
理想としては下の出力結果(コンパイル)そのまま、テキストファイルに書き出したいです。
(「計測開始」や「一時停止」などの言葉部分も含む)(「使い方:」の部分は除く)
ソースコードの適宣追加・修正をしてくだされば幸いです。
//ソースコード
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#pragma comment(lib, "winmm.lib")
void disp(DWORD ms) //関数の定義
{
printf("%02d:%02d:%02d:%03d\r",ms/3600000,(ms/60000)%60,(ms/1000)%60,ms%1000);
}
int main(void)
{
int c_flag = 0;
int t_flag=0;
DWORD counter=0,start,cur;
DWORD lap=0;
FILE *fp;
printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n");
printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n");
printf("使い方:qでプログラム終了\n");
printf("使い方:計測中にtを押すと一時停止.一時停止中にtで計測再開\n");
printf("使い方:計測中にlを押すとラップをとる\n\n");
if((fp=fopen("time.txt","wt"))==NULL){
printf("error");
exit(0);
}
disp(counter); //関数の呼び出し
for (;;){ //無限ループ
start = timeGetTime();
while (start == (cur = timeGetTime()))
{
if (kbhit()) {
switch (_getch()){ //分かりやすくするためにswitch文に書き換えた
case 's':
disp(counter);
printf(c_flag ? "\n計測中止\n" : "\n計測開始\n");
c_flag = !c_flag;
t_flag=1;
start = cur = timeGetTime();
counter = 0;
break;
fprintf(fp,"%02d:%02d:%02d:%03d\n",counter/3600000,(counter/60000)%60,(counter/1000)%60,counter%1000);
fclose(fp);
case 't':
if(counter!=0){ //counterが働いているときに動作する。
disp(counter);
printf(c_flag ? "\n一時停止\n":"\n計測再開\n");
c_flag = !c_flag;
t_flag=!t_flag;
start = cur = timeGetTime();
}
break;
fprintf(fp,"%02d:%02d:%02d:%03d\n",counter/3600000,(counter/60000)%60,(counter/1000)%60,counter%1000);
fclose(fp);
case 'r':
disp(counter);
printf("\nカウンタリセット,停止\n");
c_flag = 0;
counter = 0;
start = cur = timeGetTime();
break;
fprintf(fp,"%02d:%02d:%02d:%03d\n",counter/3600000,(counter/60000)%60,(counter/1000)%60,counter%1000);
fclose(fp);
case 'l':
if(counter!=0){ //counterが働いているときに動作する。
printf("\nラップ\n");
disp(counter-lap);
lap=counter;
printf("\n計測\n");
}
break;
fprintf(fp,"%02d:%02d:%02d:%03d\n",(counter-lap)/3600000,((counter-lap)/60000)%60,((counter-lap)/1000)%60,(counter-lap)%1000);
fclose(fp);
case 'q':
printf("\n終了\n");
fprintf(fp,"%02d:%02d:%02d:%03d\n",counter/3600000,(counter/60000)%60,(counter/1000)%60,counter%1000);
fclose(fp);
return 0; //プログラム終了
}
disp(counter);
}
}
if ((c_flag != 0)&&(t_flag!=0)){ //それぞれのフラグが0でないときカウンタが働く
counter += cur - start;
disp(counter);
}
}
}
/*
このソースコードの出力結果の例(コンパイル)
使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'で
また0からスタート
使い方:どんな状態でも小文字の'r'でカウントリセットして停止
使い方:qでプログラム終了
使い方:計測中にtを押すと一時停止.一時停止中にtで計測再開
使い方:計測中にlを押すとラップをとる
00:00:00:000
計測開始
00:00:00:500
一時停止
00:00:00:500
計測再開
00:00:01:717
一時停止
00:00:01:717
計測再開
00:00:02:559
ラップ
00:00:02:559
計測
00:00:03:682
ラップ
00:00:01:123
計測
00:00:04:837
ラップ
00:00:01:155
計測
00:00:08:877
カウンタリセット,停止
00:00:00:000
計測開始
00:00:01:809
カウンタリセット,停止
00:00:00:000
計測開始
00:00:00:780
終了
*/
/*
テキストファイルの書き出し
00:00:00:780
*/
という結果の状態です。