• ベストアンサー

カンマ区切りのデータを配列に読み込みたい

趣味でゲームを製作しているのですが、その中で、 マップデータのテキストファイルを二次元配列に読み込むようにしています。 データファイルは、カンマ区切りで、例えば、 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()ではできなくなってしまいます。 これがどうすれば可能になるのか、情けないのですがちょっと思いつかないので、アドバイスを頂ければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • R32C
  • ベストアンサー率39% (115/290)
回答No.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; }

escapekey
質問者

お礼

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

その他の回答 (3)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

CSVのようにセパレータで区切られた文字列を処理するときは、 fgets()で一行取り出して、strtok()で分割するのがよろしいかと思います。

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/strtok.html
escapekey
質問者

お礼

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

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

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); でいいかと思います。

escapekey
質問者

お礼

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

noname#39970
noname#39970
回答No.1

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

escapekey
質問者

お礼

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

関連するQ&A