- 締切済み
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'; } } このように書きできたと思ったのですが、どうもうまくいっていないみたいです。 どこが悪いのか、どういう風に書けばいいのか教えていただげれば幸いです。
- みんなの回答 (14)
- 専門家の回答
みんなの回答
- AsarKingChang
- ベストアンサー率46% (3467/7474)
自分で読み直していて、またも気になりまして。 >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)
>0,1の2パターンだと解釈しました。 これは >csvファイルは1024×2048の0と1のみで構成されています。 ここからきてるんですね。 だとしてもgetc()の戻り値が0,1の2パターンだけという事はありませんけど(0,1と書くにしても'0','1'が妥当)。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
?? 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 などと、デファインか何かで、移動可能なエリアを制限しておくと、 マップが大きくなったときなど、面倒なバグは減らせると思います。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
これってなんとなく、「マップファイル」ですよね? 「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 文字コードはこちらを参考に。
- wormhole
- ベストアンサー率28% (1626/5665)
>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)
>2パターンと256パターンでしょうか getc()が2パターン,charが256パターンという事ですか? getc()が2パターンなら具体的には何と何?
補足
0,1の2パターンだと解釈しました。
- wormhole
- ベストアンサー率28% (1626/5665)
>1つでしょうか 聞き方が悪かったかな・・・ それでもgetc()とcharの2つの問いをしてるんだけど・・・ getc()の戻り値として何種類の値が返せますか?(0を返すときもあるし、1を返すときもあるし、それが何パターンありますか) charの変数には何種類の値が格納できますか?(値として格納できるのは0,1,2,...と何パターンありますか)
補足
2パターンと256パターンでしょうか
- maiko0318
- ベストアンサー率21% (1483/6969)
>if( map[(int)gPos.y][(int)gPos.x] == 1) gPos.yとgPos.x、map[(int)gPos.y][(int)gPos.x]を表示してみましょう。
補足
回答ありがとうございます。 やってみます
- wormhole
- ベストアンサー率28% (1626/5665)
>int型です。 ではgetc()の戻り値の値はいくつありますか(仮に0~10を返すとしたら11)。 charの変数に格納できる値はいくつありますか。
補足
1つでしょうか
- koi1234
- ベストアンサー率53% (1866/3459)
質問文と補足内の >if( map[(int)gPos.y][(int)gPos.x] == 1) を見ると gPos.y の値として 0~1023 gPos.x の値として 0~2047 を期待してるように見えますがそれで合ってるんですか? 多次元配列でうまく動かないとかうまく格納されないってのは その対応間違えてるぐらいしかないと思いますけど (もしくは元のデータ(書式)が間違ってる) 読み込んだつもりのデータを再度自分でCSVに落として 元のファイルと比較すれば 読み込み処理が間違ってるのか 判断処理が間違ってるのか どっちが悪いかの判断はつくでしょう
補足
回答ありがとうございます。 やってみます。
- 1
- 2
補足
ありがとうございます。 やってみます