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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
amehirune
記事: 181
登録日時: 12年前
住所: どっか
連絡を取る:

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

#1

投稿記事 by amehirune » 12年前

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

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

↓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関数のほうに問題があるように思えます。

どこを改善すべきなのでしょうか?
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

box
記事: 2002
登録日時: 15年前

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

#2

投稿記事 by box » 12年前

amehirune さんが書きました:

コード:

		if(i==0){
			if(hiscore[i] < ch.hiscore)	hiscore[i]=ch.hiscore;
		}
ここでは、何をしていますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
amehirune
記事: 181
登録日時: 12年前
住所: どっか
連絡を取る:

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

#3

投稿記事 by amehirune » 12年前

そこでは、ゲーム中の実際のハイスコア値を、書き込む値に上書きしています。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 12年前

boxさんの言いたいのは、hiscore[0]しか書き換えないけど良いのか?ではないかと。
つまり、シフトせずにトップだけ書き換えるので、2番め以降の成績は残らないよって事だと思います。
あと2位以下の記録も残らないですね。

で問題点ですが、
③終了時にデータを更新する
では間違いなくファイルに記録されていますでしょうか?
テキストエディタで確認されましたか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
amehirune
記事: 181
登録日時: 12年前
住所: どっか
連絡を取る:

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

#5

投稿記事 by amehirune » 12年前

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

確認したところ、③の時点でデータに書き込まれていないことが発覚しました。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 12年前

こういうプログラムで動作確認したところ、ちゃんと動いていると思います。
別の問題が有るんじゃないでしょうか?

コード:

#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 );
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
amehirune
記事: 181
登録日時: 12年前
住所: どっか
連絡を取る:

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

#7

投稿記事 by amehirune » 12年前

成程…。ちょっと調べてきますが、時間がないので、返信は遅くてGWになると思われます。
なるべく早く返信しますが、ご了承ください。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

アバター
amehirune
記事: 181
登録日時: 12年前
住所: どっか
連絡を取る:

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

#8

投稿記事 by amehirune » 12年前

調べてみたところ、score.cppと無関係に、記録を呼び出す関数の位置が間違っていました。
お騒がせしてすみません。失礼しました。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

閉鎖

“C言語何でも質問掲示板” へ戻る