とっておきの「まかない飯」を教えて下さい!

趣味でゲームを製作しているのですが、その中で、
マップデータのテキストファイルを二次元配列に読み込むようにしています。
データファイルは、カンマ区切りで、例えば、
1,2,3,4,5
5,4,3,2,1
1,2,3,4,5
というようになっています。

fp=fopen(path,"r");
for(j=0; j<3; j++)
{
for(i=0; i<5; i++)
{
char c;
do{c=(getc(fp));}
while(c==','||c=='\n'||c=='\r');
map[j][i] = c-'0';
}
}

配列の各要素に読み込む中身が、0~9など1文字に限られている場合、このgetc()を使う方法で問題ないのですが、0~255など、文字数がまちまちになると、1文字を取り出すgetc()ではできなくなってしまいます。

これがどうすれば可能になるのか、情けないのですがちょっと思いつかないので、アドバイスを頂ければ幸いです。

A 回答 (4件)

少し手を入れたらできそうですね。




{
char c;
do{c=(getc(fp));}
while(c==','||c=='\n'||c=='\r');
//-----------追加-----ここから
// int calc; の宣言要
calc = 0;
do { calc = (c - '0') + (calc*10);}
while(isdigit(c=getc(fp)));
//-----------追加-----ここまで
map[j][i] = calc;
}
    • good
    • 2
この回答へのお礼

具体的にありがとうございました。
例えば123だったら、
1→1*10+2→12*10+3で、123が取り出せるということですね。
これは面白いと思いました。

お礼日時:2006/10/03 00:26

CSVのようにセパレータで区切られた文字列を処理するときは、


fgets()で一行取り出して、strtok()で分割するのがよろしいかと思います。

参考URL:http://www9.plala.or.jp/sgwr-t/lib/strtok.html
    • good
    • 1
この回答へのお礼

strtok()というのは使えそうですね。ありがとうございました。

お礼日時:2006/10/03 00:18

fscanf を使ったらどうですか


読み込むデータ数が決まっているから
fp=fopen(path,"r");
fscanf(fp,"%d,%d,%d,%d,%d\n",&map[0][0],&map[0][1],&map[0][2],&map[0][3],&map[0][4]);
fscanf(fp,"%d,%d,%d,%d,%d\n",&map[1][0],&map[1][1],&map[1][2],&map[1][3],&map[1][4]);
fscanf(fp,"%d,%d,%d,%d,%d\n",&map[2][0],&map[2][1],&map[2][2],&map[2][3],&map[2][4]);
fclose(fp);
でいいかと思います。
    • good
    • 0
この回答へのお礼

実際には巨大な二次元配列なので、全て列挙していくのは難しいのですが、方法としてはシンプルで、よくわかりました。ありがとうございました。

お礼日時:2006/10/03 00:16

whileって 中の式が真の間実行じゃなかったっけ?

    • good
    • 1
この回答へのお礼

ありがとうございます。do-whileになってるので、最初の例自体は動いています。

お礼日時:2006/10/03 00:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報