ページ 11

ファイル内容が更新されません

Posted: 2014年4月29日(火) 14:33
by amehirune
こんにちは。今回は、ファイルに関する質問です。
セーブデータの作成に取り掛かるため、先日教科書やサイトで勉強したのち、
プログラムを打った時にバグが発生しました。

具体的にいうと、ファイルの内容が更新されません。

↓score.cpp

コード:

void score_ini(){

	//ハイスコアを登録する関数
	int scanscore;
	FILE *fp;

	if( ( fp = fopen( "hiscore.dat","r"))==NULL){	//hiscore.datが見つからなかった場合

		fp = fopen( "hiscore.dat" , "w+" );			//hiscore.datを新規作成する

		for(int i=0;i<CHAR_KIND_MAX;i++){
			fprintf(fp,"%d\n",100000);				//4機分全てにハイスコア「100000」を登録
		}
		fclose(fp);

	}

	fp = fopen( "hiscore.dat" , "r" );				//4機体分のハイスコア登録
	for(int j=0;j<CHAR_KIND_MAX;j++){
		fscanf(fp,"%d",&scanscore);
		hiscore[j] = scanscore;
	}

	fclose(fp);

}

void hiscore_write(){

	FILE *fp;

	for(int i=0;i<CHAR_KIND_MAX;i++){
		if(i==0){
			if(hiscore[i] < ch.hiscore)	hiscore[i]=ch.hiscore;
		}
	}

	fp = fopen( "hiscore.dat" , "w" );
	for(int j=0;j<CHAR_KIND_MAX;j++){
		fprintf(fp,"%d\n",hiscore[j]);
	}

	fclose(fp);

}
としたのですが、

①ファイルが見当たらないのでファイルを新規作成
②ハイスコアが更新されるべき状態になる
③終了時にデータを更新する
④再起動。データが更新されていなくなっている

という状態に陥っております。
デバッグ時の結果から、score_ini関数には問題がなく、
ゲームが終了される直前に、確かにhiscore_write関数を読み込んでおりますので、
hiscore_write関数のほうに問題があるように思えます。

どこを改善すべきなのでしょうか?

Re: ファイル内容が更新されません

Posted: 2014年4月29日(火) 15:34
by box
amehirune さんが書きました:

コード:

		if(i==0){
			if(hiscore[i] < ch.hiscore)	hiscore[i]=ch.hiscore;
		}
ここでは、何をしていますか?

Re: ファイル内容が更新されません

Posted: 2014年4月29日(火) 16:42
by amehirune
そこでは、ゲーム中の実際のハイスコア値を、書き込む値に上書きしています。

Re: ファイル内容が更新されません

Posted: 2014年4月29日(火) 17:09
by softya(ソフト屋)
boxさんの言いたいのは、hiscore[0]しか書き換えないけど良いのか?ではないかと。
つまり、シフトせずにトップだけ書き換えるので、2番め以降の成績は残らないよって事だと思います。
あと2位以下の記録も残らないですね。

で問題点ですが、
③終了時にデータを更新する
では間違いなくファイルに記録されていますでしょうか?
テキストエディタで確認されましたか?

Re: ファイル内容が更新されません

Posted: 2014年4月29日(火) 17:18
by amehirune
あ・・。説明が遅れました。
これは、スコアの順番ではなく。(まだ実装していませんが)4機体分のハイスコアです。
後々、この「0」は、キャラクタナンバーに変更する予定です。
ここが0になっているのは、ひとまず今実装している機体の番号を0と仮設定しているせいです。

確認したところ、③の時点でデータに書き込まれていないことが発覚しました。

Re: ファイル内容が更新されません

Posted: 2014年4月29日(火) 17:28
by softya(ソフト屋)
こういうプログラムで動作確認したところ、ちゃんと動いていると思います。
別の問題が有るんじゃないでしょうか?

コード:

#include<stdio.h>
#define CHAR_KIND_MAX 5

int chhiscore = 0;

int hiscore[CHAR_KIND_MAX];

void score_ini() {

	//ハイスコアを登録する関数
	int scanscore;
	FILE *fp;

	if( ( fp = fopen( "hiscore.dat", "r" ) ) == NULL ) { //hiscore.datが見つからなかった場合

		fp = fopen( "hiscore.dat" , "w+" );         //hiscore.datを新規作成する

		for( int i = 0; i < CHAR_KIND_MAX; i++ ) {
			fprintf( fp, "%d\n", 100000 );          //4機分全てにハイスコア「100000」を登録
		}
		fclose( fp );

	}

	fp = fopen( "hiscore.dat" , "r" );              //4機体分のハイスコア登録
	for( int j = 0; j < CHAR_KIND_MAX; j++ ) {
		fscanf( fp, "%d", &scanscore );
		hiscore[j] = scanscore;
	}
	
	chhiscore = hiscore[0] + 10;
	
	fclose( fp );

}

void hiscore_write() {

	FILE *fp;

	for( int i = 0; i < CHAR_KIND_MAX; i++ ) {
		if( i == 0 ) {
			if( hiscore[i] < chhiscore ) hiscore[i] = chhiscore;
		}
	}

	fp = fopen( "hiscore.dat" , "w" );
	for( int j = 0; j < CHAR_KIND_MAX; j++ ) {
		fprintf( fp, "%d\n", hiscore[j] );
	}

	fclose( fp );

}

int main( void ) {
	score_ini();
	hiscore_write();
	return( 0 );
}

Re: ファイル内容が更新されません

Posted: 2014年4月29日(火) 17:31
by amehirune
成程…。ちょっと調べてきますが、時間がないので、返信は遅くてGWになると思われます。
なるべく早く返信しますが、ご了承ください。

Re: ファイル内容が更新されません

Posted: 2014年4月30日(水) 17:13
by amehirune
調べてみたところ、score.cppと無関係に、記録を呼び出す関数の位置が間違っていました。
お騒がせしてすみません。失礼しました。