- 締切済み
テキストファイル内でのカンマ(,)の探索方法
テキストファイルで、 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( ×××,"," )をうまく使えばいいと思い、いろいろやっているのですが、うまくできません。 また、ファイルの最後までを配列に入れたら終了、というのも、どう記述していいかわかりません。 どうぞよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- a-kuma
- ベストアンサー率50% (1122/2211)
> 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)
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; }
お礼
ありがとうございます!! できました!!ずっと詰まって悩んでいたところが解決しました!!大感謝です!! ところで、もし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, のような場合,英語を無視して数字のみを配列に入れる、ということはできるでしょうか。
補足
小数の場合、できました!!strtodなんてのがあったんですね。 知らなかった。勉強になりました。 英語が混じった場合の方、アドバイスよろしくお願いします。