- ベストアンサー
ファイルの入出力に関する質問
CSVファイルを読み込んで、処理をするプログラムを書いています。 しかし、うまくいきません。 CSVファイルは 単語1,数値データ 単語2,数値データ のようになっており、 これをsの配列に格納したいと思っています。 プログラムは以下の通りなんですが。。。 strtokはhttp://www9.plala.or.jp/sgwr-t/lib/strtok.html を参考にしました。 どなたかおしえていただけないでしょうか? #include<stdio.h> #include <string.h> int main(void) { FILE *fp; char s[1000][1000]; char tp[256]; int i=0; if((fp=fopen("in.csv","r"))==NULL){ printf("ファイルオープンできませんよ\n"); exit(1); } while(fgets(tp,256,fp)!=NULL){ tp=strtok(fp,","); puts(s[i][0]=tp); while (tp != NULL ) { tp = strtok(NULL,","); if (tp= NULL ){ puts(s[i][1]=tp); }}i++; } return(0); }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> char s[1000][1000]; 1000(行)x2(データレコード数)x256(文字列長)の3次元配列が必要です。 char s[1000][2][256]; #tpが256なのでそれ以上のサイズは不要 > while(fgets(tp,256,fp)!=NULL){ iが1000になった時点(1000行読んだ)でもループアウトするようにしないとエラーになります。 > tp=strtok(fp,","); > tp = strtok(NULL,","); 上のstrtok()の第1引数はfpではなくtpです。 また戻り値はポインタ変数を別に用意して受け取りましょう。 > puts(s[i][0]=tp); > puts(s[i][1]=tp); このように文字列をコピーすることはできません。 strcpy()を使いましょう。 strcpy(s[i][0], tp); puts(s[i][0]); なおfscanf()を使った方が楽かもしれません。
その他の回答 (1)
- yukimican
- ベストアンサー率70% (112/159)
CSVファイル ・タイトル行なし ・最大1000行まで ・1行に2項目のデータ - カラム1=単語(文字列/最大256文字) - カラム2=数値データ(整数) 動作仕様 ・CSVファイルを開き、一行ずつ読み込む ・データを項目別に分け、すべてメモリ上の変数に設定する とみなして、勝手に書いていきます。 1.格納先について 構造体 または 項目別の変数 で配列を作る必要があります。 [例1] char key[256][1000]; int val[1000]; [例2] struct dat_{ char key[256]; int val; } dat[1000]; 2.行の読み込みについて CSVであれば、strtokを使うよりも、 1) 文字列の先頭からstrchr()でカンマ文字を探し、 2) 文字列先頭からカンマ文字の手前まで(単語の部分)を strncpy()で文字列用の変数に格納し、 3) カンマ文字の後ろから、行の終端まで(数値の部分)を atoi()で文字列から数値に変換 という手順で各行を処理していくのが良いと思います。 [擬似コード] ※処理の流れを書くだけで、動作保証はしません。 char line[256]; // 行 char *camma; // カンマ文字の位置 int *key_len // 単語の長さ int i=0; while(fgets(fp,256,line)!=NULL){ //行読み込み camma = strchr(line, ','); // カンマ文字を検索 if(camma) { word_len = camma - line; // 文字数計算 strncpy(dat[i].key, line, key_len); // コピー str[key_len] = '\0'; // 末尾に注意 dat[i].val = atoi(camma+1); // 数字 → 数値 if(++i >= 1000) break; // 1000行までなので。 } }
お礼
ご回答ありがとうございます。 参考にさせていただきます。 しかし、自分の書いたプログラムでも動かせるように努力したいと 思います。
補足
自分なりに考えたのですが、うまく動きません。 int main(void) { FILE *fp; char s[5][1000][2][256]; char tp[256]; char *ttp; int i=0,ii=0; if((fp=fopen("out1.csv","r"))==NULL){ printf("ファイルオープンできませんよ\n"); exit(1); } while(fgets(tp,256,fp)!=NULL){ ttp=strtok(tp,","); strcpy(s[0][ii][i][0],ttp);//ここにエラーがでます。 puts(s[0][ii][i][0]);//ここにエラーがでます。 while (ttp != NULL ) { i++; ttp = strtok(NULL,","); if (ttp= NULL ){ strcpy(s[0][ii][i][0],ttp);//ここにエラーがでます。 puts(s[0][ii][i][0]);//ここにエラーがでます。 }}i=0; ii++;if(ii>=1000)break; } return(0); } //ここにエラーがでます。 というところにエラーがでます。 もしよければアドバイスをいただけないでしょうか?