アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。
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;
}

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/16 06:25

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

    • good
    • 0

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