• 締切済み

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

テキストファイルで、    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

  • テキストファイルからの読み込みがうまくできません(>_<)

    C言語初心者の学生です。 読んでいただきありがとうございます。 テキストファイルに数字を並べ、それを読み込んで char型の変数に入れ、さらにatofによってfloat型に変換し、計算に使っていくということがしたいのですが、 テキストファイルの書き方がおかしいのか、プログラムの書き方がおかしいのか、テキストファイルに書いたとおりの値とは異なるおかしな値が表示されます・・・ だいたいのプログラムの書き方は、 char型のa2、float型のa[n][n]、FILE *fpINを定義して if ( (fpIN = fopen("matrix.txt", "r" )) != NULL ){ if ( fgets(a2,sizeof(a2),fpIN) != NULL ){ } fclose( fpIN ); } for(i=0;i<n;i++){ for(j=0;j<n;j++){ a[i][j]=atof(a2); } } というようなものです。 テキストファイルは、数字をカンマで区切ったり、スペースで区切ったりと いろいろ試してみたのですが、やはり書き込んだ値とは異なるものが表示されます・・・ 最終的には、ひとつのテキストファイルに 複数の行列のための値を書き込んでおき、それを読み込んで計算させるということをしたいのです・・・ どなたか、正しく値が読み込まれない原因が分かりましたら、教えていただければと思います。 お手数をおかけしてすみませんが、よろしくお願いします。

  • テキストファイルから文字列を読み込んで二次元配列に格納するには

    毎回お世話になっています。 ただいまC言語を勉強中の学生です。 基本的な文法は頭に入れたつもりでしたが、まだポインタと ファイルの入出力に苦手意識があり 実際うまくできないでいるので どなたか ご存知の方にアドバイスいただければと思って書き込ませていただきます。 今回練習しているのは 先に述べたように、テキストファイルに abc def ghi jkl などと文字列を書いておき、そのファイルを読み込んで 二次元配列に格納したいのですが、何を勘違いしているのか、 うまく実現できません。 参考書などを見て 一次元配列へ格納する場合は できたようなのですが、今後このプログラムを発展させる段階で 二次元配列に文字列を 格納できたほうが好都合なので 今模索しています。。。 ちなみに 一次元配列に格納する場合は 以下のように書きました。 #include<stdio.h> #include<stdlib.h> main() { char a[10]; FILE *fp; fp = fopen("word.dat", "r"); if (fp == NULL) { printf("File does not exist.\n"); exit(1); } while(fscanf(fp,"%s",a)==1){ printf("%s\n",a); } fclose(fp); return 0; } 実はコレに関しても分からない点があり、それは 目的の配列変数 a[]に格納できたのだから それを確認したいと思い printfで a[0]~a[10]を表示してみようとしたところ 変に文字化け したものが表示されたり、何も表示されなかったり よく分からないことが起きます。私は何を勘違いしてしまっているのでしょうか(>_<) 長々と書いてしまいましたが、今回 御教授いただきたいのは (1)、テキストファイルから 英字の文字列を読み込んで二次元配列に格納するために用いるのに 一番最適な関数はどれか(fscanfやfgetsなど) そして、その関数を使って 一番シンプルな記述をするにはどのように記述すればよいのか (2)、上のようなプログラムの書き方で、配列aにテキストファイルから読み込んで格納できたようなのに、a[0]~a[10]をprintfしたときに うまく中身が表示されないのはなぜか。 という点なのですが、(1)をとりあえず急いでおりますので、(2)はおまけ程度に考えていただければと思います。 なぜかファイルの入出力がいまだに把握できなくて苦手としておりますので、どうか よろしくお願いいたします。

  • 【VBA】カンマを無くすには

    下記のマクロで返された値をcsvファイルとして保存すると、最後の値の後に、複数のカンマが付いて保存されてしまいます。 マクロ : Cells(r + 1, 4).FormulaR1C1 = "=(TEXT(HOUR(NOW()),""00"")&TEXT(MINUTE(NOW()),""00"")&TEXT(SECOND(NOW()),""00""))*1" csvの結果 : 220236,,,,,,,,,,,,,,, この複数のカンマを付けずに値だけをcsvで保存する方法を教えてください。 宜しくお願いいたします。

  • テキストファイルをエクセルで開く時、編集して開けませんか?

    すごく初歩的な質問で申し訳ないのですが・・・ お客さんからCSV形式(カンマ編集)のテキストファイルをもらったのですが、エクセルでファイルを開く時、すぐに開いてしまい困ってます。 例えば、カンマ編集していないテキストファイルだったら、開く時に、まず『テキストファイルウィザード』なるボックスが開いて、どこで区切るとか、どんな文字タイプだとかを指定してから開く事ができますよね? CSV形式のファイルでも、この『テキストファイルウィザード』から指定をしてから開く事はできないのでしょうか? 何故先に指定をしたいかと言うと、カンマで区切っている値を編集してから開きたいのです。 開いてから文字の指定しようと思っても、数字のみの値だと、前の0が消えてしまってて編集不可能になるんです。 例えば、6桁の数字のみのコードがセットされている場合、『000123』となっているものが、開くと『123』となり前の0が消えてしまうのです。 どなたか良い方法を教えて下さい! エクセルのバージョンは、Excel 2000 ウィンドウズ98の環境です。

  • テキストファイルをリードしグラフ化する手法

    カンマ区切りのテキストファイルを読み込み、列単位でグラフ化させたいと思っております。 ログファイルの形式はこのような感じです。(Hexで16bitカンマ区切り) FFFF,EEEE,DDDD,…,AAAA AABB,CCDD,EEFF,…,0000 … 1111,2222,3333,…,0AFF このようなファイルを読み込んで列単位で処理したいです。 2次元配列を使うのかななんて思ったりするのですが・・・ どういう手法で処理するのか筋道だけでも教えていただけますと助かります。 よろしくお願いいたします。

  • テキストファイルを配列に

    始めまして C言語にてテキストファイルの中身を読み込み一次元配列に代入するというシステムを作ろうとしているのですがわかりません テキストファイルの中身は 12 5312 72 7 444 53 7884 といった具合で100数行あり一行ごとに配列に入れたいです 勉強を始めたばっかりで本を見ても書いていなく困っています わかるかたご指導願えますか? よろしくお願いいたします

  • 特定のカンマの後にカンマを追加したい。

    カンマ区切りテキストファイルの中身をsedコマンドを使用してカンマを一括で追加しようと思ったのですが、末尾にカンマを付けることは出来たのですが例えば特定カンマの次にカンマを追加する場合はどのようにすればいいでしょうか?(5つのカンマで区切のファイルに対して3カラム目の次に新しく追加するといった感じです。) 既に各カンマごとに値が入っているでそれを崩さずカンマの追加をしたいのですが。 参考までに自分が末尾にカンマを追加したときに使用した書式になります。 sed 's/$/,/g' test.txt > test2.txt よろしくお願い致します。

  • visual basic6.0でのテキストファイルからの読み込みについて。

    vb初心者です。 数値をテキストファイルに保存しています。その数値は、x方向に10個、y方向に3個、つまり10列3行の数値を保存しています。 そのデータを2次元配列 D(x,y)として読み込みたいのです。 for x=0 to 9, for y=0 to 2 と範囲を指定して、数値全部を読み込むときは、D(x,y)の値は正しく入っているのですが、 ある範囲だけを読み込みたいとき、たとえば for x=0 to 5, for y=0 to 1 としたとき、D(x,y)は別の数値が読み込まれてしまいます。 これは、テキストファイルの数値が配列になっていないということですよね?? どうすれば、テキストファイルの数値を2次元配列として読み込むことができるのでしょうか? 文章が解りにくくてごめんなさい!!よろしくお願いします! 

  • gnuplot:テキストファイルからのコンター図

    4.4.3win32を使っています。 現在テキストファイルにスペースで区切られたデータ□が、下のように並んでいます。 □□□□□□□□□ □□□□□□□□□ □□□□□□□□□ □□□□□□□□□ □□□□□□□□□ □はZ軸、縦の並びがX軸、横の並びがY軸に対応しています。 gnuplotを用いてテキストファイルからコンター図を作成する場合は、 下のようにX軸、Y軸の値も書いて、さらに配列を変えてから行うしかないのでしょうか。 11□ 22□ 33□ 44□ 55□ 元のテキストデータから簡単に作成する方法があれば教えていただけないでしょうか。

  • 【C++】行列データの読み込み

    C++でテキストファイルに以下のようにカンマ区切り(例なのでスペース等でも構いません)で記述された行列を2次元配列に格納する方法が分かりません。 例 1,2,3 4,5,6 7,8,9 よい方法があればご教授願います。

専門家に質問してみよう