テキストファイルで、
   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 回答 (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 がカウントアップされてゆきます。
    • good
    • 0

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;
}

この回答への補足

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

補足日時:2001/08/24 19:16
    • good
    • 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,
のような場合,英語を無視して数字のみを配列に入れる、ということはできるでしょうか。
  

お礼日時:2001/08/24 18:55

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

今、見られている記事はコレ!

おしトピ編集部からのゆる~い質問を出題中

お題をもっとみる

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ