セーブデータのロード

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

セーブデータのロード

#1

投稿記事 by LUNA » 15年前

お久しぶりです。LUNAです。(もう覚えている人はいないでしょうが)
今回、C++と、DXライブラリを使い、学校の進級制作でグループでゲームを作っています。その内容は、RPGの様なパラメーターの成長要素を盛り込んだアクションゲームで今自分はそのセーブロードを作っています。しかし、主人公のパラメータの保存は出来ても、ファイルからロードした値を数値に変換してキャラクタークラスの変数に代入出来なくて困っています。
言葉で伝えにくいのですが、大まかな感じはこうです。

セーブデータをロード時にファイルに保存されている値を数値に変換

関数の引数(予め作られたキャラクターのクラス内の一部の変数)に代入。

自分はファイル内の値を数値に戻す方法まではわかるのですが、保存されている値は最終的に桁がバラバラ(一の桁から万の桁まで)な値が幾つも出てくるので、それぞれに合わせて代入するのが分からなくなってしまいます。     
**********************************************
以下プログラム(セーブ、ロード関連)
**********************************************
#include"file_in_out.h"
#include"mych.h"
//------------------------------------------------------
//キャラクターのパラメータ関連
//------------------------------------------------------
void chardate::save_chardate(mych player_st){      //キャラクタークラス内のステータスパラメータの保存
    char fname[/url]="char_date.txt";
    FILE *fp;
    fp = fopen(fname,"w");

    if(fp!=NULL){
        fprintf(fp,"%d\n%d\n",player_st.speed,player_st.jp);                //ファイル出力処理
    }

    fclose(fp);                //閉じる

}
//--------------------------------------------------------------------------------
//今現在ここで詰んでる。
//--------------------------------------------------------------------------------
void chardate::load_chardate(mych *load_player_st){        //ファイル内に入っているキャラクターのパラメータをロードして引数のキャラクタークラスに代入する
    char fname[/url]="char_date.txt";
    char PLAYER_ST[2][5];
    int i=0;
    FILE *fp;
    fp = fopen(fname,"r");
    if(fp!=NULL){
                      //ここでファイルの中身の文字列を数値(int)に変換
                                            //引数であるキャラクターのクラスの一部の変数に代入
                                            //
    }
    fclose(fp);

}
//------------------------------------------------------
//マップデータの読み込み
//------------------------------------------------------

void mapdate::load_mapdate(){
}


//------------------------------------------------------
//システムデータ関連
//------------------------------------------------------

void game_systemdate::save_systemdate(){
}


void game_systemdate::load_systemdate(){
}
**********************************************
マップデータの読み込みとシステムデータ関連の部分はまだ作ってないので何も書いてありません。



添付ファイルはロード対象のファイルで、中には保存された値が入っています。
どうか、知恵を貸していただけたら幸いです。

non

Re:セーブデータのロード

#2

投稿記事 by non » 15年前

お尋ねの意味がわかりません。
添付されたデータ
4
15
2181
99999
3
2
の6個の数値はchar_date.txtの内容なのでしょうか?
しかし、save_chardateの関数では、データを2個しか保存していないようです。
これが、なぜ、6個になっているのでしょうか?

load_chardateでデータを読むのに
fscanfでデータ個数読めばいいと思うのですが、何が問題なのでしょうか?
クラスを示してもらわないと、何という変数に読めばいいのかは、わかりません。
char PLAYER_ST[2][5];も、何なのかわかりませんし・・・

LUNA

Re:セーブデータのロード

#3

投稿記事 by LUNA » 15年前

やっぱり分りづらかったでしたか。すみません。添付ファイルは仰る通り、char_date.txtです。の中に書かれている数値は最終的にそれくらいのデータが入る感じで、データを増やしました。セーブのところは関係ないです。
char PLAYER_ST[2][5] は試行錯誤した時の残骸で削除し忘れていました。本当にすみません。



>>fscanfでデータ個数読めばいいと思うのですが

fscanfついてググってみましたが、こんな便利なものあったんですね・・・ずっとfgetcで一文字づつ取り出して用意しておいた配列に代入して、文字の'0'から取り込んだ数値を引いた数で変換して・・・なんて方法とっていたので気がつきませんでした。
アドバイスありがとうございます。

LUNA

Re:セーブデータのロード

#4

投稿記事 by LUNA » 15年前

fscanfの存在のおかげで簡単に出来ました。本当にありがとうございます。
(・・・4日間も悩んだのに・・・(汗))

たかぎ

Re:セーブデータのロード

#5

投稿記事 by たかぎ » 15年前

> fscanfついてググってみましたが、こんな便利なものあったんですね・・・

さらにいえば、std::ifstreamを使えばもっと便利です。

std::ifstream ifs(fname);
int value;
ifs >> value;
if (ifs.fail())
{
// エラー処理
ifs.clear();
}

のようにすればOKです。通常、クローズする必要すらありません。
fscanfと比べて圧倒的に有利なのはエラーチェックができることです。
fscanfでは、入力した整数値がオーバーフローしても検出する術がありません。
ほかに、std::stringに対して直接入力できるといった利点もあります(文字配列の大きさを気にしなくて済みます)。

デフォルトの名無しさん

Re:セーブデータのロード

#6

投稿記事 by デフォルトの名無しさん » 15年前

> fscanfでは、入力した整数値がオーバーフローしても検出する術がありません。
C++ 2003 の時点では istream による数値入力も fscanf() に基づいて動作が
定められているので、どちらも同じなのでは?

次期規格改訂で strto*() を用いる動作に修正されるようです。
http://www.open-std.org/jtc1/sc22/wg21/ ... ts.html#23

たかぎ

Re:セーブデータのロード

#7

投稿記事 by たかぎ » 15年前

> C++ 2003 の時点では istream による数値入力も fscanf() に基づいて動作が
> 定められているので、どちらも同じなのでは?

規格上は確かにそうなんですが、主だった実装ではエラーが検出できるようになっています。
DXライブラリを利用可能な処理系に限れば、実際にエラー検出も出きますし、移植性の問題もありません。
一方で、scanf系関数の場合は本当にダメです。

デフォルトの名無しさん

Re:セーブデータのロード

#8

投稿記事 by デフォルトの名無しさん » 15年前

> 規格上は確かにそうなんですが、主だった実装ではエラーが検出できるようになっています。

なるほど。まっとうなエラー検出の手段があるかないかが重要だったわけですね。
手元の g++ 4.3 でも範囲外の値を与えると fail() が true になることを確認できました。

閉鎖

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