セーブデータの作成

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ヨシタケ

セーブデータの作成

#1

投稿記事 by ヨシタケ » 7年前

もし、セーブデータが読み込めなかったとき
セーブデータを作成するようにしようと思っています。
こうすることでセーブデータを消したことでランキングとステージクリア数を初期化できるようにしようと思っています。

コード:

//攻撃に関する構造体
typedef struct RANKDATA{
	char name[7];	//名前
	int point;		//点数
}RANKDATA;
static RANKDATA Data[10];
static RANKDATA FirstData[10] ={{"NONAME",10000},{"NONAME",9000},{"NONAME",8000},
		{"NONAME",7000},{"NONAME",6000},{"NONAME",5000},{"NONAME",4000},
	{"NONAME",3000},{"NONAME",2000},{"NONAME",1000}};
const int firstclearnumber = 0;
char name[10][10];
static int buff1,buff3;
static char buff2[10];
static int clearnumber = 0;		//クリアしたステージ数


//-------------------------------------
//	関数名: void ReadSaveData()
//	処理:	セーブデータの読み込み
//-------------------------------------
void ReadSaveData(){
	FILE *fp = fopen(("SaveData.dat"),"rb");
	int i = 0;
	int j = 0;
	if(fp == NULL)
	{
		FILE *fp = fopen( "SaveData.dat", "wb" );
		while(!feof(fp) && !ferror(fp) && j<10)//04
		{
			if(j==0){
				fwrite( &firstclearnumber, sizeof(firstclearnumber), 1, fp ); 
			}else{
				fwrite( &FirstData, sizeof(FirstData), 1, fp ); // SaveData_t構造体の中身を出力
			}
			j++;
		}
		fclose(fp);
		for(int k = 0;k<10;k++){
			LoadRank(FirstData[k].point,FirstData[k].name,k);
			Data[k].point = 0;
		}
	}

	while(!feof(fp) && !ferror(fp))//04
	{

			if(i==0){
				fread( &clearnumber, sizeof(clearnumber),1,fp);//i=i+1;
			}else{
	   			/* csvから、10進整数、文字列、小数を読み込む */

				fread( &Data, sizeof(Data),1,fp);
			}
		i++;
	}
	fclose(fp);
	for(int j = 0;j<10;j++){
		LoadRank(Data[j].point,Data[j].name,j);
		Data[j].point = 0;
	}
}
if(fp == NULL)のときセーブデータを作成するようにしよと思ったのですが、
エラーが出てしまいました。
読み込めなかったときセーブデータを作成するためのいい方法があれば教えてください。

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

Re: セーブデータの作成

#2

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

"wb"のファイルに対してfeof(fp)は動作保証されていなかった様な?
あとライトのオープンも失敗するかもしれないので、それも要注意。

更に追記、書込した後fcloseして読み出そうとするけどマズイと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6275
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: セーブデータの作成

#3

投稿記事 by みけCAT » 7年前

自分の場合、
「セーブデータを読み込む関数」「セーブデータを書き込む関数」「セーブデータを(メモリ内で)初期化する関数」を作っておき、
セーブデータを読み込めなかったらセーブデータを初期化して書き込むようにしています。
この時、後のゲームでは初期化したメモリ上のセーブデータがそのまま使用されます。

擬似コード

コード:

function セーブデータをファイルから読み込む() {
    省略
}

function セーブデータをファイルに書き込む() {
    省略
}

function メモリ上のセーブデータを初期化する() {
    省略
}

function ロード() {
    セーブデータをファイルから読み込む()
    読み込みに失敗したならば {
        メモリ上のセーブデータを初期化する()
        セーブデータをファイルに書き込む()
    }
}

function セーブ() {
    セーブデータをファイルに書き込む()
}
書いていて思いましたが、初期化したあとすぐにファイルに書き込む必要はないかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

nil
記事: 428
登録日時: 8年前

Re: セーブデータの作成

#4

投稿記事 by nil » 7年前

私ならば
セーブファイルがなければデフォルトのデータ( FirstData )をゲーム内で保持するデータ( Data )にコピーします。

ヨシタケ

Re: セーブデータの作成

#5

投稿記事 by ヨシタケ » 7年前

色々なアドバイスありがとうございます。
読み込み時の!feof(fp) && !ferror(fp)を消してwhile(j<10)としました。
また、fclose(fp)は2つあることについては

コード:

	if(fp == NULL)
	{
         初期セーブの作成
	}else{
                    読み込み時の処理
	}
というようにしました。

閉鎖

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