ページ 11

ファイル読み込み

Posted: 2015年10月04日(日) 18:03
by luc
win32API,C++を使用。タイムランキングを作成しております。
流れは現在 タイトル→ゲーム開始→ゲームクリア→タイムランキングの表示→タイトルとループになっています。
プログラムを落とさないでゲームを続けるとタイムランキングは正常に表示されるのですが、一旦プログラムを落として起動するとタイムランキングの値がおかしくなってしまいます。
1位が1秒
2位が0秒
3位が0秒
というふうになってしまいます。

Ranking_Load()をwinmainのウィンドウ生成時に呼び出し、
Ranking_saveはゲームクリア画面で呼び出しています。

Ranking.h

コード:

#include <stdio.h>
#include <windows.h>

extern int r_time[5];   //ランキングのタイム
extern int now_time[5];  //現在プレイしているタイム
static char FileName[] = "Ranking.txt";  //ランキングテキスト
void Ranking_Load();
void Ranking_save();

Ranking.cpp

コード:


void Ranking_Load()  //ランキング読み込み
{
	FILE *fp;
	int i, j, tmp;

	if ((fp = fopen(FileName, "r")) == NULL){
		for (i = 0; i < 3; i++){
			r_time[i] = 999;
		}
	}else{
		for (i = 0; i < 3; i++){
			fscanf(fp, "%d", &r_time[i]);	//読み込み
		}
		fclose(fp);
	}
	return;
}



void Ranking_save()  //ランキング保存
{
	FILE *fp;
	TCHAR mes[80];
	int i,tmp,tmp2;

	if ((fp = fopen(FileName, "w")) == NULL)
	{
		wsprintf(mes, TEXT("データファイルのオープンに失敗しました。保存を中止しました。\n"));
		OutputDebugString(mes);
		return;
	}

						
		if (r_time[0] > S_time){		//ランキング1位より現在プレイしてる人のほうが早ければ
			tmp = r_time[0];
			r_time[0] = S_time;		//現在の1位を上書き
			tmp2 = r_time[1];
			r_time[1] = tmp;		//ランキング1位の人を2位に下げる	
			r_time[2] = tmp2;		//ランキング2位の人を3位に下げる
		}

		else if (r_time[1] > S_time && S_time >r_time[0]){	//ランキング2位より現在プレイしてる人のほうが高ければ
			tmp = r_time[1];
			r_time[1] = S_time;
			r_time[2] = tmp;
		}

		else if (r_time[2] > S_time && S_time >r_time[1]){		
			r_time[2] = S_time;
		}
			fprintf(fp, "1位 %d秒\n", r_time[0]);
			fprintf(fp, "2位 %d秒\n", r_time[1]);
			fprintf(fp, "3位 %d秒\n", r_time[2]);
	fclose(fp);
}

Re: ファイル読み込み

Posted: 2015年10月04日(日) 18:30
by みけCAT
luc さんが書きました:1位が1秒
2位が0秒
3位が0秒
というふうになってしまいます。
ファイル中のゴミを読み飛ばす処理が入っていないからですね。
テストはしていませんが、読み込み処理(Ranking_Load)で使われている"%d"を"%*s%d%*s"に変えて、「[1-3]位」と「秒」を読み飛ばすようにしてみてください。

Re: ファイル読み込み

Posted: 2015年10月04日(日) 18:41
by luc
すいません上の文、修正します。
一回目のゲームクリアは正常に値が入ってます。30秒でクリアした場合
1位 30秒
2位 999秒
3位 999秒
ですがゲームを落として、もう一度クリアすると
1位 1秒
2位 0秒
3位 0秒
となってしまいます。
ゲームを落とさないでもう一度プレイをすると40秒でクリアした場合
1位 30秒
2位 40秒
3位 999秒
と正常に表示されます。
%*s%d%*sに変えてみましたが、最初にクリアした時でも
1位1秒
2位0秒
3位0秒
となってしまいました。

Re: ファイル読み込み

Posted: 2015年10月05日(月) 09:43
by luc
すいません。解決しました。mainのロードとセーブを読み込むの位置を間違えてました