• 締切済み

テキストファイル内でのカンマ(,)の探索方法

テキストファイルで、    1,2,3,4,5,    6,7,8,9,10,    11,12,13,14,15, のような数字の並びがあったとします。 それを読み込んで  a[0]={1,2,3,4,5} a[1]={6,7,8,9,10} a[2]={11,12,13,14,15} のように、次のカンマまでの値を2次元配列にいれる、ということをやりたいと思っています。 fgets あたりと、strpbrk( ×××,"," )をうまく使えばいいと思い、いろいろやっているのですが、うまくできません。 また、ファイルの最後までを配列に入れたら終了、というのも、どう記述していいかわかりません。 どうぞよろしくお願いします。

みんなの回答

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> data.txtの中身に英語が混じっていた場合 strtok() で切り出した文字列が *数字とみなせない場合* を判別するには、 strtol() の第二引数を利用します。 char* buf[1024]; char* p; long data; data = strtol(buf, &p, 0); とすると、もし buf が数値とみなせなければ、p は buf の最初を指します。 もし buf の先頭からいくつかが数字とみなすことができれば、数値と みなせなくなった場所を指します。 提示されたような丸々数値とみなせない場合には、 char* ep; data[i][j] = (int)strtol(v, &ep, 0); if (*ep == '\0') { /* 文字列の最後を指している、ということは数値だったということ */   ++j; } というようにすれば、数値の場合だけ j がカウントアップされてゆきます。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

strpbrk() を使うと、カンマの場所を見つけるだけで、次のカンマまでを ひとくぎりで見る処理をしなければならないので、ちょっと面倒です。 こういうことをするために strtok() という関数が用意されています。 ちょっと書いてみましたが、こんな感じ。 #include <stdlib.h> #include <stdio.h> #include <string.h> int main() {   char* tok = ", \t\n"; /* 念のため、カンマ以外に空白・タブ・改行文字も数値の区切りとして扱う */   char buf[1024];   FILE* f = fopen("data.txt", "r");   int data[10][10];   int i = 0, j;   memset(data, -1, sizeof(data));   while (fgets(buf, sizeof(buf), f) != NULL) /* これが、「ファイルの最後まで」にあたる */   {     char* v;     /* このループが、一行の内容をカンマでばらして行く処理 */     for (j = 0, v = strtok(buf, tok) ; v != NULL ; ++j, v = strtok(NULL, tok))     {       data[i][j] = (int)strtol(v, NULL, 0);     }     ++i;   }   return 0; }

sweet78
質問者

お礼

ありがとうございます!! できました!!ずっと詰まって悩んでいたところが解決しました!!大感謝です!! ところで、もしdata.txtの中身が小数の場合 int data[10][10]→double data[10][10] (int)strtol(v, NULL, 0); →(double)strtol(v, NULL, 0); にすればいいと思ってやってみたのですが、うまくいきません。 他にどこを変更すればいいのでしょうか。 またdata.txtの中身に英語が混じっていた場合,例えば A 1,2,3,4,5, B 6,7,8,9,10, のような場合,英語を無視して数字のみを配列に入れる、ということはできるでしょうか。   

sweet78
質問者

補足

小数の場合、できました!!strtodなんてのがあったんですね。 知らなかった。勉強になりました。 英語が混じった場合の方、アドバイスよろしくお願いします。

関連するQ&A