ファイルを読み込まなくなった?

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

ファイルを読み込まなくなった?

#1

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

今まではゲーム開始前(タイトル、オプション、ランキング、キャラセレクト)をまとめてtitle.cppに書いていたのですが、
色々と変更をして長くなってきたのでタイトルと起動時の初期化をmain.cppに、ほかはOption.cpp(オプション)、rank.cpp(ランキング),Select.cpp(キャラ、ステージ選択),save.cpp(ファイルの読み込みと書き込み)というように変更しました。
そのようにしたらなぜかゲームが起動してもすぐに閉じるようになりました。
おそらくsave.cppのvoid RankSaveData()でうまくファイルを読み込んでないのが問題なのだと思うのですが、

コード:


	FILE *fp = fopen(("ranking.csv"),"rb");
	int i = 0;
	if(fp == NULL)
	{
		exit(1);
	}
の内容はまったくいじってないため原因がさっぱりわかりません。ちゃんとblocktower2内にranking.csvのファイルもあります。どなたか原因のわかる人教えてください。お願いします。
ソースは下記のサイトにアップしました。パスワードは「YT2013」です。

http://www1.axfc.net/uploader/so/2857782

もうひとつついでに聞いておきたいのですが
今回のは元々龍神録を参考にしていたため関数をfunction.hにすべてまとめていますが、ソースファイルごとにヘッダーファイルを作成したほうがよいのでしょうか。

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

Re: ファイルを読み込まなくなった?

#2

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

まず、前から言ってますがデバッガで追いかけるべきだと思います。
すでに規模が大きいので他の人が追いかけるのが難しくなってきています。

>今回のは元々龍神録を参考にしていたため関数をfunction.hにすべてまとめていますが、ソースファイルごとにヘッダーファイルを作成したほうがよいのでしょうか。

一般的には、メンテ性が高いのでそうします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

non
記事: 1097
登録日時: 13年前

Re: ファイルを読み込まなくなった?

#3

投稿記事 by non » 11年前

エラーが生じたときに、ただ単にexitするのではなく、メッセージを表示させて終わりましょう。
non

ヨシタケ

Re: ファイルを読み込まなくなった?

#4

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

>エラーが生じたときに、ただ単にexitするのではなく、メッセージを表示させて終わりましょう。
ちょっと変更した際にprintfを消してました。

>まず、前から言ってますがデバッガで追いかけるべきだと思います。
すみません。最初に聞いておいておくべきだったのですが、デバッグ(D)とデバッガって違うんですが。
一応、ReadSaveData()をコメントにしたときはちゃんと起動したので原因はここにあると思い、

コード:

void ReadSaveData(){
	FILE *fp = fopen(("ranking.csv"),"rb");  //(1)
	int i = 0;
	if(fp == NULL)//(2)
	{
		printf("cannot open csv.\n");
		exit(1);
	}

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

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

				fscanf( fp, "%s,%d",buff2, &buff3);  //(3)

				strcpy(name[i-1],buff2);  //(4)
				point[i-1] = buff3;
			}
		i++;
	}
	fclose(fp);
	//LoadRank(point,name);
}
(1)~(4)にブレークポイントをつけてデバッグを開始して、(1)のところにつけたとき
fpのところで「CXX0030: エラーです: 式を評価できません」と出てきました。
それでも解決方法がわかりませんでした。

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

Re: ファイルを読み込まなくなった?

#5

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

デバッグをするための方法の1つがデバッガでVC++には標準で含まれています。
まぁ、ようするにブレークポイントとステップ実行で追いかけましょうと言う話です。

(1)の処でブレークしたらfpはまだ不定なので、「CXX0030: エラーです: 式を評価できません」が正解です。
ブレークは実行前ブレークですので注意してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヨシタケ

Re: ファイルを読み込まなくなった?

#6

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

クリアしたステージから始められるようにranking.csvの中身を
1
NONAME,10000
NONAME,9000
(省略)
NONAME,1000
というように変更してたのですが、
クリアしたステージ数,1
名前,点数
NONAME,10000
NONAME,9000
(省略)
NONAME,1000
というように変え、ソースコードを

コード:

static int buff2,buff6;
static char buff1[10],buff3[10],buff4[10],buff5[10];
static int clearnumber = 0;		//クリアしたステージ数
static int  point[11];	//ランキングの点数
static char name[10][10];	//ランキングの名前

void ReadSaveData(){
	FILE *fp = fopen(("ranking.csv"),"rb");
	int i = 0;
	if(fp == NULL)
	{
		printf("cannot open csv.\n");
		exit(1);
	}

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

			if(i==0){
				fscanf( fp, "%s,%d",buff1,buff2);//i=i+1;
				clearnumber = buff2;
			}else if(i ==1){
				fscanf( fp, "%s,%s",buff3,buff4);
			}else{
	   			/* csvから、10進整数、文字列、小数を読み込む */

				fscanf( fp, "%s,%d",buff5, &buff6);

				strcpy(name[i-1],buff5);
				point[i-1] = buff6;
			}
		i++;
	}
	fclose(fp);
	//LoadRank(point,name);
}
というように変更したら、ちゃんと起動するようになりました。
ファイルを読み込むとき1行で読み込む変数の数がすべて同じでないといけないのですか?

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

Re: ファイルを読み込まなくなった?

#7

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

そんな事はありません。
あと、ここバグです。
fscanf( fp, "%s,%d",buff1,buff2);//i=i+1; → fscanf( fp, "%s,%d",buff1,&buff2);//i=i+1;
バグっているのに問題なく動いているとしたら不思議です。

【補足】buff1,buff2などの適当な名前を付けているとミスしやすので、ちゃんと変数名を付けましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヨシタケ

Re: ファイルを読み込まなくなった?

#8

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

新・ゲームプログラミングの館を参考に
まず、SaveData.datを作成してから、
freadを使って読み込むように変えました。ランキング用のデータは
構造体RANKDATAを作り

コード:

typedef struct RANKDATA{
	char name[10];	//名前
	int point;		//点数
}RANKDATA;
というようにして、読み込みのプログラムを

コード:

void ReadSaveData(){
	FILE *fp = fopen(("SaveData1.dat"),"rb");
	int i = 0;
	if(fp == NULL)
	{
		printf("cannot open dat.\n");
		exit(1);
	}

	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);
	}
}
というように直しました。
新・ゲームプログラミングの館だと構造体を使っていたのでfreadの場合、1行から複数の項目を読み込むとき
構造体を使わないといけないのかと思ったのですが実際のところどうなのですか?
さすがに2項目だけで構造体を作るのもどうかと思ったので質問してみました。

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

Re: ファイルを読み込まなくなった?

#9

投稿記事 by zxc » 11年前

  構造体にしておけば、後で項目増えても構造体への追加ですみますが、バラバラにすれば項目ごとの処理を書く必要が出てくるのではないでしょうか。

  読み取りにしろ書き出すにしろ、そういう処理をするデータなら、そういう名前の構造体なり変数なりに纏めたりしたほうが分かりやすいはずです。

  以上の2つの理由から構造体にしたほうが良いと私は思います。

ヨシタケ

Re: ファイルを読み込まなくなった?

#10

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

わかりました。構造体を使っていきます。
かなりスレが長くなってしまいましたが、みなさんアドバイス本当にありがとうございました。

閉鎖

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