OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

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

  • 困ってます
  • 質問No.123311
  • 閲覧数106
  • ありがとう数4
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 10% (1/10)

テキストファイルで、
   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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全2件)

  • 回答No.1
レベル14

ベストアンサー率 50% (1122/2211)

strpbrk() を使うと、カンマの場所を見つけるだけで、次のカンマまでを ひとくぎりで見る処理をしなければならないので、ちょっと面倒です。 こういうことをするために strtok() という関数が用意されています。 ちょっと書いてみましたが、こんな感じ。 #include <stdlib.h> #include <stdio.h> #include < ...続きを読む
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

お礼率 10% (1/10)

小数の場合、できました!!strtodなんてのがあったんですね。
知らなかった。勉強になりました。
英語が混じった場合の方、アドバイスよろしくお願いします。
投稿日時 - 2001-08-24 19:16:57
お礼コメント
sweet78

お礼率 10% (1/10)

ありがとうございます!!
できました!!ずっと詰まって悩んでいたところが解決しました!!大感謝です!!

ところで、もし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:51


  • 回答No.2
レベル14

ベストアンサー率 50% (1122/2211)

> data.txtの中身に英語が混じっていた場合 strtok() で切り出した文字列が *数字とみなせない場合* を判別するには、 strtol() の第二引数を利用します。 char* buf[1024]; char* p; long data; data = strtol(buf, &p, 0); とすると、もし buf が数値とみなせなければ、p は bu ...続きを読む
> 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 がカウントアップされてゆきます。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ