プロが教えるわが家の防犯対策術!

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';
}
}
このように書きできたと思ったのですが、どうもうまくいっていないみたいです。
どこが悪いのか、どういう風に書けばいいのか教えていただげれば幸いです。

A 回答 (14件中1~10件)

自分で読み直していて、またも気になりまして。



>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は改行コードも読むので、少し予備を追加しておく
ここだけですが。
    • good
    • 0

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



これは

>csvファイルは1024×2048の0と1のみで構成されています。

ここからきてるんですね。
だとしてもgetc()の戻り値が0,1の2パターンだけという事はありませんけど(0,1と書くにしても'0','1'が妥当)。
    • good
    • 0

??



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
などと、デファインか何かで、移動可能なエリアを制限しておくと、
マップが大きくなったときなど、面倒なバグは減らせると思います。
    • good
    • 0

これってなんとなく、「マップファイル」ですよね?


「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
文字コードはこちらを参考に。

この回答への補足

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

補足日時:2014/05/31 10:20
    • good
    • 0

>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()について調べてくださいな。
    • good
    • 0

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



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

この回答への補足

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

補足日時:2014/05/31 01:05
    • good
    • 0

>1つでしょうか



聞き方が悪かったかな・・・
それでもgetc()とcharの2つの問いをしてるんだけど・・・

getc()の戻り値として何種類の値が返せますか?(0を返すときもあるし、1を返すときもあるし、それが何パターンありますか)
charの変数には何種類の値が格納できますか?(値として格納できるのは0,1,2,...と何パターンありますか)

この回答への補足

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

補足日時:2014/05/31 00:00
    • good
    • 0

>if( map[(int)gPos.y][(int)gPos.x] == 1)



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

この回答への補足

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

補足日時:2014/05/30 22:54
    • good
    • 0

>int型です。



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

この回答への補足

1つでしょうか

補足日時:2014/05/30 23:19
    • good
    • 0

質問文と補足内の


>if( map[(int)gPos.y][(int)gPos.x] == 1)
を見ると 
gPos.y の値として 0~1023
gPos.x の値として 0~2047
を期待してるように見えますがそれで合ってるんですか?

多次元配列でうまく動かないとかうまく格納されないってのは
その対応間違えてるぐらいしかないと思いますけど
(もしくは元のデータ(書式)が間違ってる)

読み込んだつもりのデータを再度自分でCSVに落として
元のファイルと比較すれば
読み込み処理が間違ってるのか
判断処理が間違ってるのか
どっちが悪いかの判断はつくでしょう

この回答への補足

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

補足日時:2014/05/30 23:15
    • good
    • 0

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