• 締切済み

C言語 csv 配列

CSVファイルを2次元配列に格納したいのですが、書き方がわかりません。 csvファイルは1024×2048の0と1のみで構成されています。 fp=fopen(path,"r"); for(j=0; j<1024; j++) { for(i=0; i<2048; i++) { char c; do{c=(getc(fp));} while(c==','||c=='\n'||c=='\r'); map[j][i] = c-'0'; } } このように書きできたと思ったのですが、どうもうまくいっていないみたいです。 どこが悪いのか、どういう風に書けばいいのか教えていただげれば幸いです。

みんなの回答

回答No.14

自分で読み直していて、またも気になりまして。 >1024×2048の0と1のみ X=1024 Y=2048 ですよね? for(j=0; j<1024; j++) // y for(i=0; i<2048; i++) // x もしかして逆ではない? (これが最終的に解答だったりして?) ということで、前回のソースを修正しておきます。 バッファーが足りなかったもので。 char buffer[2048+2]; // fgetsは改行コードも読むので、少し予備を追加しておく ここだけですが。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.13

>0,1の2パターンだと解釈しました。 これは >csvファイルは1024×2048の0と1のみで構成されています。 ここからきてるんですね。 だとしてもgetc()の戻り値が0,1の2パターンだけという事はありませんけど(0,1と書くにしても'0','1'が妥当)。

回答No.12

?? if( map[(int)gPos.y][(int)gPos.x] == 1) { gPos.x-=1; } 自分の位置を調べてもダメですよ^^ もしや・・・ padという構造体があったとして、 キーが押されたときに、 up,down,left,rightが0以外が入ると仮定します。 if (pad.up) {  if (map[gPos.y-1][gPos.x]) gPos.y--; } if (pad.down) {  if (map[gPos.y+1][gPos.x]) gPos.y++; } if (pad.left) {  if (map[gPos.y][gPos.x-1]) gPos.x--; } if (pad.right) {  if (map[gPos.y][gPos.x+1]) gPos.x++; } です。 要するに今から以降としている位置が「いけるか?」をチェックしてOKなら 位置変数を加算減算すればOKですよ。 で、今現在がXが0だったら、 gPos.x-1 これはまずいので、  if (gPos.x>0 && map[gPos.y][gPos.x-1]) gPos.x--; と言う感じで、0の時は、既にNGとして処理すればOK  if (gPos.x<2047 && map[gPos.y][gPos.x+1]) gPos.x++; #define MIN_X 0 #define MAX_X 2047 などと、デファインか何かで、移動可能なエリアを制限しておくと、 マップが大きくなったときなど、面倒なバグは減らせると思います。

回答No.11

これってなんとなく、「マップファイル」ですよね? 「MapFile.dat」 0000000000 0001111000 0001111000 0001111000 0000000000 みたいに、CSVじゃなくて、まともに、それだけを入れたほうが、読みやすい気がします。 元のファイルの時点でも。 そうすれば、fgets < 1ライン読み込みを、2048回やるだけですから。 で、1024のX軸も、ダイレクトに計算できて楽な気がしますよ。 ついでに、"0"の文字コードは0x30,"1"は0x31なので、 char buffer[1024+2]; // fgetsは改行コードも読むので、少し予備を追加しておく fp=fopen(path,"r"); for(j=0; j<1024; j++) { fgets(buffer,sizeof(buffer),fp); for(i=0; i<2048; i++) { map[j][i] = buffer[i]&1; // 文字コードの最後の1ビットを値にする } } fclose(fp); こんだけじゃだめ? EOFチェックなどがないので、1024行に満たない場合や、 2048個データが無いなどはチェックしてません。 後本当に、0と1以外しかいれないのであれば、 まともに代入してしまって、判定の時01でチェックしたってOKです。 情報量は、どちらも同じ8ビットでしかないので。 http://e-words.jp/p/r-ascii.html 文字コードはこちらを参考に。

takano1128
質問者

補足

ありがとうございます。 やってみます

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.10

>0,1の2パターンだと解釈しました。 もしかして私が#8で書いた >(0を返すときもあるし、1を返すときもあるし、それが何パターンありますか) を数えたとかいう話? getc()が0と1のどちらかしか返さないのなら charの変数cに代入しても0と1のどちらかしか代入されませんが >while(c==','||c=='\n'||c=='\r'); 何で3パターンの比較してるの? ',','\n','\r'はどれも、0でも1でもないですよ? マニュアル読みかえしてgetc()について調べてくださいな。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.9

>2パターンと256パターンでしょうか getc()が2パターン,charが256パターンという事ですか? getc()が2パターンなら具体的には何と何?

takano1128
質問者

補足

0,1の2パターンだと解釈しました。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.8

>1つでしょうか 聞き方が悪かったかな・・・ それでもgetc()とcharの2つの問いをしてるんだけど・・・ getc()の戻り値として何種類の値が返せますか?(0を返すときもあるし、1を返すときもあるし、それが何パターンありますか) charの変数には何種類の値が格納できますか?(値として格納できるのは0,1,2,...と何パターンありますか)

takano1128
質問者

補足

2パターンと256パターンでしょうか

  • maiko0318
  • ベストアンサー率21% (1483/6969)
回答No.7

>if( map[(int)gPos.y][(int)gPos.x] == 1) gPos.yとgPos.x、map[(int)gPos.y][(int)gPos.x]を表示してみましょう。

takano1128
質問者

補足

回答ありがとうございます。 やってみます

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.6

>int型です。 ではgetc()の戻り値の値はいくつありますか(仮に0~10を返すとしたら11)。 charの変数に格納できる値はいくつありますか。

takano1128
質問者

補足

1つでしょうか

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.5

質問文と補足内の >if( map[(int)gPos.y][(int)gPos.x] == 1) を見ると  gPos.y の値として 0~1023 gPos.x の値として 0~2047 を期待してるように見えますがそれで合ってるんですか? 多次元配列でうまく動かないとかうまく格納されないってのは その対応間違えてるぐらいしかないと思いますけど (もしくは元のデータ(書式)が間違ってる) 読み込んだつもりのデータを再度自分でCSVに落として 元のファイルと比較すれば 読み込み処理が間違ってるのか 判断処理が間違ってるのか どっちが悪いかの判断はつくでしょう

takano1128
質問者

補足

回答ありがとうございます。 やってみます。

関連するQ&A