• ベストアンサー

Cで二次元配列の読み込み

はじめまして。 hiraです。 今非常に基本的であろうことに悩んでいます。まだまだプログラムを始めたところなのでうまくいきません。 内容は・・・ あるファイルを読み込んで、二次元の配列に格納していく。 です。 具体的には test.txtというファイルがあり、中身は数字の二次元配列です。 カンマやtabで区切られています。配列の大きさ、数字の桁数などはファイルによって違います。 そのファイルを読み込んで、配列に格納したいと考えています。 今は一列を読み込むことには成功しています。そこからどのようにして分けて言ったらいいのか・・・ご教示お願いします。 もしくは、もっと違う方法で読み込む方法があればよろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fin; char array[256]; char buf[256]; fin=fopen("test.txt","r"); if(fin == NULL){ printf("%sがオープンできません\n",fin); exit(1); } while(fgets(buf,256,fin) != NULL) {           ここが問題・・・ } fclose(fin); return 0; }

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★『strchr』、『strpbrk』、『strtok』などの文字列関数を使う。 ・どの関数を使ってもカンマ、タブ区切り、数字を切り分けてくれます。 ・サンプルとして『strtok』関数バージョンを紹介します。 ・『while』文の内部のみです。 サンプル: char buff[ 256 ]; char *tokn = ",\t"; ←カンマとタブ文字を指定 char *seek; ←文字列のシーク移動用 while ( fgets(buff,sizeof(buff),fin) != NULL ){ ←sizeof(buff)で『buff』のサイズ(256)になる  if ( (seek = strtok(buff,tokn)) != NULL ){   do {    /*    value = atoi( seek ); ←『atoi』関数で数字文字列を整数に変換して value にセット    ここは出題です。    */   } while ( (seek = strtok(NULL,tokn)) != NULL );  } } 最後に: ・最初の if の『strtok』関数で切り分ける文字列『buff』と区切り文字群『tokn』で最初の数字セルを  取得します。取得後に do-while 部分で数字文字列を整数に変換して2次元配列へセットします。  ここの部分は、質問者さんが実装して下さい。→『atoi』関数で整数変換できるので頑張って下さい。 ・次に while の『strtok』関数で続きの切り分ける文字列を取得します。  もしも、カンマやタブ文字が見つからないと NULL を返しますので do-while 文を抜けます。 ・これで1行単位で『数字,数字,数字,…,数字』という CSV 形式のデータを2次元配列にセットできます。 ・上記のはあくまでサンプルですので、2次元配列へのセット部分は hira1234 さんが記述して下さい。

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

お礼

ありがとうございました! できました。感謝です♪

その他の回答 (1)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

char* strtok_r( char* str, const char* sep, char** last) などが定番かと。

関連するQ&A