t0. セーブデータの作り方
初め、データの保存はテキストファイルの保存から勉強すると思います。
しかし構造体に複雑に入っているデータをいちいちテキストファイルで書き込み、読み込むのは大変です。
そこでバイナリファイルに書き込む事を試みます。
fwrite関数、fread関数を使います。知らない人はググってみましょう。
この関数を使えば構造体の中身がごっそりそのままファイルに記録できるのです。
例えば
typedef struct{ int clear_flag; //クリアしたかどうかのフラグ int money; //お金 int highscore; //ハイスコア }save_data_t; save_data_t save_data;
save_dataというセーブデータの構造体があったとします。これをいちいち何かにわけて処理をする必要がなく
fwrite( &save_data, sizeof(save_data_t), 1, fp ) ;
とかけば構造体のデータがそのままファイルに保存出来ます。
では構造体のデータを読み込む、書き込むプログラムのサンプルを見てみましょう。
サンプルでは途中で適当な値を構造体に代入しています。(コード中の{}はプログラムの括りを解り易く書いているもので、特に意味はありません)
#include <stdio.h> #include <stdlib.h> #include <time.h> //セーブデータの構造体 typedef struct{ int clear_flag; //クリアしたかどうかのフラグ int money; //お金 int highscore; //ハイスコア }save_data_t; int main(){ char *name = "save_data.dat"; // save_data.dat(セーブデータファイル) FILE *fp; save_data_t save_data; srand( (unsigned) time( NULL ) ); //時間による乱数の初期化 /*ファイルの内容からデータをロード*/ { if( ( fp = fopen( name, "rb" ) ) == NULL ) { printf("ファイルオープンエラー\n"); } else{ //ファイルからデータを読み込む fread( &save_data, sizeof(save_data_t), 1, fp ) ; fclose( fp );//解放 printf("クリア:%d お金:%d ハイスコア:%d\n", save_data.clear_flag, save_data.money, save_data.highscore); } } { //適当に値を代入してみる save_data.clear_flag = rand()%2; save_data.money = rand()%100; save_data.highscore = rand()%10000; } /*データの内容をファイルにセーブ*/ { if( ( fp = fopen( name, "wb" ) ) == NULL ) { printf("ファイルオープンエラー\n"); } else{ fwrite( &save_data, sizeof(save_data_t), 1, fp ) ; fclose( fp ); } } return 0; } 実行結果 クリア:0 お金:96 ハイスコア:1317
このようにファイルに書き込んだときと同じように一括で読み込めるので非常に便利です。
- Remical Soft -