ファイルの読み込み

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

ファイルの読み込み

#1

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

ブロック崩しにランキングを追加しようにと思っています。なので、csvファイルにデートの読み書きできるようにしたいのですが
うまくいきません。
読み込みについて

コード:

void readrank(){
	FILE *fp;

	if((fp = fopen(("ranking.csv"),"r")) == NULL)
	{
		printf("cannot open csv.\n");
		exit(1);
	}

	while(!feof(fp) && !ferror(fp) && aaa==0 )//04
	{
		if(i==0)
			fscanf( fp, "%[^,],%[^,],%s",buff1, buff2);//i=i+1;

		if(i!=0)
		{
	   		/* csvから、10進整数、文字列、小数を読み込む */

			fscanf( fp, "%d,%d",&buff3, &buff4);

			if(buff3==NULL)
			{
				aaa=aaa+1;
				break;
			}
			else
			{
				rank[i-1] = buff3;
				rankp[i-1] = buff4;
			}
		}
		i++;
	}
	fclose(fp);
}
というふうにしています。
そして表示は

コード:

	DrawString(100,100,"順位 点数",GetColor(255,255,255));
	for(int i=0 ;i<10;i++){ 
		DrawFormatString(100,120+i*20,GetColor(255,255,255),"%d  %d",rank[i],rankp[i]);
	}
というようにしてあります。
しかし、うまく表示されず
csvの中身             実際の表示
順位 点数             順位 点数
1 1000                2 900
2 900 3 800
3 800 4 700
4 700 5 600
5 600 6 500
6 500 7 400
7 400 8 300
8 300 9 200
9 200 10 100
10 100 10 100
というようになってしまいます。
試しに順位と点数の表示を
DrawFormatString(100,100,GetColor(255,255,255),"%s %s",buff1,buff2);
に変えてみたところちゃんと表示されるためなぜか1位のところだけ飛ばされるようです。

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

Re: ファイルの読み込み

#2

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

iの初期化が見当たらないようです。
あと一時変数にすぎないiをグローバル変数にするのは致命的なバグの原因となりやすいです。
特に意味もなく、グーバル変数を使っていそうなので気をつけてください。

それと

コード:

        if(i==0)
            fscanf( fp, "%[^,],%[^,],%s",buff1, buff2);//i=i+1;
 
        if(i!=0)

コード:

        if(i==0)
        {
            fscanf( fp, "%[^,],%[^,],%s",buff1, buff2);//i=i+1;
 		}
 		else
 		{
としたほうが可読性も上がりバグが出る可能性も下がります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヨシタケ

Re: ファイルの読み込み

#3

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

iを中に入れて

コード:

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

	while(!feof(fp) && !ferror(fp) && aaa==0 )//04
	{

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

				fscanf( fp, "%d,%d",&buff3, &buff4);

				if(buff3==NULL)
				{
					aaa=aaa+1;
					break;
				}
				else
				{
					rank[i-1] = buff3;
					rankp[i-1] = buff4;
				}
			}
		i++;
	}
	fclose(fp);
}
というように変更したのですが結果はかわりませんでした。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: ファイルの読み込み

#4

投稿記事 by h2so5 » 13年前

気になったところを挙げます
  • buff3はポインタではないはずなので buff3==NULL は条件としておかしい
  • buff3, buff4, aaaなど変数の名前がいい加減で役割がわからない、グローバル変数にする必要性がない
  • インクリメントの記述に統一性がない (aaa=aaa+1 と i++)
  • 意味のない括弧 ("ranking.csv")
  • インデントが統一されていない

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

Re: ファイルの読み込み

#5

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

buff3の扱い全般がバグの原因ですね。
fscanf( fp, "%d,%d",&buff3, &buff4);だけ見るとbuff3 はint型だと推測されますが、if(buff3==NULL)だとポインタ型なのでしょうか?
型とポインタの扱いがちゃんと出来ていないと思います。

ところでaaaってなんでしょう? 変数名から意味が推測できません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヨシタケ

Re: ファイルの読み込み

#6

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

すいません
i=0の部分を
fscanf( fp, "%s,%s",buff1, buff2);//i=i+1;
というように変えたらちゃんと表示されるようになりました。
この関数ですが「最初の文字列とばして次からの行の数字だけを取得したい場合どうすればいいのだろうか」と考えて
ほかの人のプログラムの内容をコピペしました。なのでaaaがなんなのかは私自身わかりません。
ちなみにそのプログラムでもbuff3のところint型でif(buff3==NULL)となっていました。これがおかしいというのは全く知りませんでしたが。
色々とアドマイスありがとうございました。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: ファイルの読み込み

#7

投稿記事 by h2so5 » 13年前

ヨシタケ さんが書きました: ほかの人のプログラムの内容をコピペしました。なのでaaaがなんなのかは私自身わかりません。
ちなみにそのプログラムでもbuff3のところint型でif(buff3==NULL)となっていました。これがおかしいというのは全く知りませんでしたが。
分からないまま変なコードで開発を進めると後で困ると思いますよ。
それにbuff3がポインタだったとしても、関数内でbuff3がNULLになるような処理がないですね。

閉鎖

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