無題

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

無題

#1

投稿記事 by 胡椒 » 15年前

ゲームプログラミング館の「t0 セーブデータの作り方」でのコードなんですが、

#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;
}

とありますよね。
なぜここで
char *name = "save_data.dat";
といったポインタを使っているのでしょうか?

f( ( fp = fopen( name, "rb" ) ) == NULL ) {
のところは
char *name = "save_data.dat";
を宣言せずに
f( ( fp = fopen( "save_data.dat", "rb" ) ) == NULL ) {
ではだめなのでしょうか?

一応基本は分かりますが、まだまだポインタは勉強中なのでよろしくお願いします。

胡椒

セーブデータについて

#2

投稿記事 by 胡椒 » 15年前

すみません・・・
タイトルをつけるのを忘れてしまいました・・・

Dixq (管理人)

Re:無題

#3

投稿記事 by Dixq (管理人) » 15年前

それでもいいですが、後者の場合、ファイル名が変わったら、2ヶ所変更しないといけないですよね。
変更しないといけないヶ所はなるべく少なくしようというわけです。
それなら書き換え可能形式で開けばいいわけですが、なるべくわかりやすくというわけであぁなっています。

toyo

Re:セーブデータについて

#4

投稿記事 by toyo » 15年前

f( ( fp = fopen( "save_data.dat", "rb" ) ) == NULL ) {
でもOKですよ
でもプログラムを見ると
if( ( fp = fopen( name, "wb" ) ) == NULL ) {
と書き込む部分にも同じ変数を使っていますね
ファイル名をsave_data.dat以外に変更したい場合にポインタ変数にしておくと1箇所の書き換えだけですみます
またタイプミスや修正し忘れのようなバグも減るので同じ名前を複数使う場合は変数にしたほうが便利です

胡椒

Re:無題

#5

投稿記事 by 胡椒 » 15年前

ありがとうございます。
ではchar *name = "save_data.dat";の部分は
char name[/url] = "save_data.dat";
でもいいわけですよね。
この違いは何かあるのでしょうか?

ookami

Re:無題

#6

投稿記事 by ookami » 15年前

↓こんな違いがあります。
http://www.nurs.or.jp/~sug/soft/tora/tora8.htm

これは、今すんなり理解できなくても、すぐに困るということは無いと思います。

Dixq (管理人)

Re:無題

#7

投稿記事 by Dixq (管理人) » 15年前

ookamiさんのリンク先をお読みになれば大体解ると思いますが、
リンク先の事をプログラムで確かめると


#include <stdio.h>

int main(void) {
char *strA = "abc";
char strB[/url] = "abc";

// *(strA+1) = 'd';
*(strB+1) = 'd';

printf("%s", strA);
printf("%s", strB);

return 0;
}


上のプログラムのコメントアウトを外すとエラーになるという事ですね。
strBは書き換え可能なアドレスにあるのに対して、strAは書き換えが出来ません。

この辺はなかなか難しい所ですよね~。
最初のうちはstrAのような書き方はしない方がいいと思います。

胡椒

Re:無題

#8

投稿記事 by 胡椒 » 15年前

ookamiさん
管理人さん

ありがとうございます。勉強になりました。
無事、配列のほうでデータを作ることが出来ました!

やっくん

Re:無題

#9

投稿記事 by やっくん » 15年前

/* 質問をしていましたが、スレを立てるので削除しました */ 画像

閉鎖

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