ページ 11

テキストデータの読み込み

Posted: 2010年11月18日(木) 02:08
by mint
C言語で、テキストデータを読み込みたいのですが、テキストの内容の一部を読みたいと考えています。
テキストの内容は次のようになっています。t # 0ではじまり、一番左がvの行とeの行がそれぞれ複数行あり、t # 1とtではじまる行が現れます。これが繰り返されt # 10 まで続きます。

////テキストの内容/////
t # 0
v 0 5
v 1 2
 ・
 ・
v 99 6
e 1 2 0
e 2 3 0
 ・
 ・
t # 1
 ・
 ・
t # 10 
////テキストの内容//////

しかし、私が必要としているのは、t # 0 とt # 1の間のv、eの行の数値だけです。vの行は3列で、eの行は4列あります。(4列のなかで中の2列の数値が分かれば良いです。)

この場合、どのように読み込んだらよいのでしょうか。
ご教授ください。

画像

Re:テキストデータの読み込み

Posted: 2010年11月18日(木) 04:37
by ゆーずぃ
汎用性がなくがっちがちでいいのなら、

1.fgetsで一行読み込んで捨てる

2.fgetsを7回ループさせ、それぞれ別の配列に入れる(char s[7][好きなだけ]を宣言しておき、ループ中のfgetsの中でs[0]な感じに使う)

2.5.もしもeの中2行以外が要らないのならば、ループの4回目と7回目は何もしない。(iは0から始まることに注意)

3.atoi等を使って好きに字句解析する。


3からは読み込んだ後の使い道が分からないので何とも書けません。合計を求めるのか、一個読んでは捨てるのか、全部取っておくのか等、それによって変わってくるので。

因みにループのカウントにはiを使用することを勝手に想定してます。


ちょっと試してないのでfgetsの中の2次元配列の使い方が間違っているかもしれませんが…(--;)

Re:テキストデータの読み込み

Posted: 2010年11月18日(木) 10:54
by さかまき
私が書くならこんな感じ。一行ガバッと呼んで、行頭の1文字目のコードで処理分岐させます。
t = -1;
    while(NULL != (fgets(onelin, 80, fp)))
    {
        switch(onelin[0])
        {
            case 't':
                sscanf(onelin,"t # %d",&t);
                //printf("\nt = %d",t);
                break;

            case 'v':
                if (0 != t) break;
                sscanf(onelin,"v %d %d",&v1,&v2);
                printf("\nv = %d %d",v1,v2);
                break;

            case 'e':
                if (0 != t) break;
                sscanf(onelin,"e %d %d %d",&e1,&e2,&e3);
                printf("\ne = %d %d %d",e1,e2,e3);
                break;

            default:
                break;
        }
    }