みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

結果をファイルにちゃんと保存できない

本プログラムは、プログラム(欠けている数字を三回当てるゲーム)の始まりから終了までにかかった時間を関数に引数として渡し、ファイルに保存するプログラムです。
また、二回目以降動作させる場合はかかった時間のベスト10の結果を
表示させます。

その際に使用する関数が下記のかかった時間を二回目以降に表示させるget_data関数とベスト10に入ればファイルに保存するf_hozon関数です。

関数f_hozonは、メインプログラムからの仮引数(double *saikou,int m)→saikouは保存する領域。mは配列saikouの保存する場所です。

ところが、このプログラムを動作させてみたところ
ベスト10までの値が塗り替えられないですし、小数点以下の
桁数が非常に大きい変な値が格納されてしまいます。
また、動作させるたびに変な値が入力されてしまいます。

何がおかしいために、このように動作してしまうのでしょうか?
よろしくお願いいたします。

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<float.h>
#include"getputch.h"

#define swap(type,x,y) do{type t=x;x=y;y=t;}while(0)

char dtfile[] = "LACKNUM.DAT";

double get_data(void)
{
FILE *fp;
double best[10];
int i,j;

if((fp=fopen("dtfile","r"))==NULL)
{
printf("本プログラムを実行するのは初めてですね。\n");
for(j=0;j<10;j++)
{
best[j]=DBL_MAX;
}
}
else
{
printf("これまでのべスト10の得点(所要時間)は");
for(i=0;i<10;i++)
{
fscanf(fp,"%lf",&best[i]);
printf("%d位:%.1f秒\n",i+1,best[i]);
}
}
return *best;
}

void fhozon(double *saikou,int m)
{
FILE *fp;

if((fp=fopen("dtfile","w"))==NULL)
{
printf("エラー発生!!\n");
}
else
{
fprintf(fp," %lf\n",saikou[m]);
fclose(fp);
}
}

int main(void)
{

int vstr[9]={1,2,3,4,5,6,7,8,9};
int hstr[8];
int i,m,retry,x,y;
clock_t start,end;
double jikan;
double saikou[10];
int j,l;
char ch;

srand(time(NULL));

printf("欠けている数字を入力してください。\n");

do{

*saikou=get_data();

start=clock();

for(m=0;m<3;m++)
{
x=rand()%9;

j=0;
for(i=0;i<9;i++)
{
if(i!=x)
{
hstr[j++]=vstr[i];
}
}

for(i=7;i>0;i--)
{
y=rand()%i;
swap(int,hstr[i],hstr[y]);
}

for(i=0;i<8;i++)
{
printf("%d ",hstr[i]);
}
printf(":");

while(1){
ch=getch();
putch(ch);
if(ch!=vstr[x]+'0')
{
printf("\b");
}
else
{
break;
}
}

printf("\n");

}

end=clock();

jikan=(double)(end-start)/CLOCKS_PER_SEC;

printf("%.1f秒かかりました。\n",jikan);

for(l=0;l<10;l++)
{
if(jikan<saikou[l])
{
printf("%d位の得点(所要時間)を更新しました!!\n",l+1);
fhozon(saikou,l);
}
}

printf("もう一度しますか … (0)いいえ(1)はい:");
scanf("%d",&retry);

}while(retry==1);

return 0;
}

投稿日時 - 2009-12-20 17:23:20

QNo.5536066

困ってます

質問者が選んだベストアンサー

>if((fp=fopen("dtfile","r"))==NULL)
この書き方では対象ファイルはdtfileになります。
変数dtfileで指定してあるLACKNUM.DATにはなりません。

>fscanf(fp,"%lf",&best[i]);
オープンするファイルが間違えているので、期待する値を読めてません。
fscanfは戻り値として読み込めた個数を返すので
if ( fscanf(fp,"%lf",&best[i]) != 1 )
などとしてエラーチェックしたほうがいいです。

> if((fp=fopen("dtfile","w"))==NULL)
ファイルの間違いは上の通り
ファイルオープンモード"w"は上書きになるので、この時点でファイルが空になります。
>fprintf(fp," %lf\n",saikou[m]);
その、空になったファイルに、この一行だけが書き込まれます。

とりあえず、気づいたののみ

投稿日時 - 2009-12-20 18:37:28

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問