• 締切済み

プログラミングについて質問

現在、ストップウォッチの機能をもつプログラムを拡張して出力結果をテキストファイルに書き出すプログラムを作っているのですが、どうしても最後だけの「終了」部分のタイマーだけしかテキストファイルに書き出せません。(ストップウォッチの機能自体は完成しています) 理想としては下の出力結果(コンパイル)そのまま、テキストファイルに書き出したいです。 (「計測開始」や「一時停止」などの言葉部分も含む)(「使い方:」の部分は除く) ソースコードの適宣追加・修正をしてくだされば幸いです。 //ソースコード #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 */ という結果の状態です。

みんなの回答

  • suzukikun
  • ベストアンサー率28% (372/1325)
回答No.1

出力したいのを計測結果と同じようにfprintfで出力したら?

関連するQ&A