scanfを用いたデータの読み込みについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mint

scanfを用いたデータの読み込みについて

#1

投稿記事 by mint » 14年前

はじめまして。
テキストデータをscanfを用いて読み込みたいと考えています。しかし、
テキストデータの内容が、列数が揃っておらず、どのように命令文を書いたら良いのか分かりません。

テキストの内容は以下のようになっています。

/////////テキストの内容////////////
1:9
(0, 1, 12~, 5)

2:5
(0, 1, 12~, 3)
(1, 2, 4~, 6)
(0, 2, 13~, 7)

3:6
(・・・・・・)
////////以上//////////////////////
○:△の行と複数の( , , , )の行、そして一行の空きから構成されています。

一番上の○:△の○は番号で、その後1ずつ10000まで増えていきます。
△は0から10までの数です(特に必要ありません)。(, , ,)の数は何行ぶんになるかは分かりませんが、大体10こまでとなっています。

このデータを読み込んで、○の番号と(, , ,)の中の4つの数を&a,&b,&c,&d,&eなどとして、番号との組み合わせとして記録したいのですが、書き方が分かりません。

ご教授ください。よろしくお願いします。

初心者

Re:scanfを用いたデータの読み込みについて

#2

投稿記事 by 初心者 » 14年前

c言語??

かなり省いて

fscanf(fp,"%d:%d",&a[n][m],a[n][m+1]);

ここで()じゃなくなるまで繰り返してやればいいのでは??



それより何が具体的にわからないのですか?

mint

Re:scanfを用いたデータの読み込みについて

#3

投稿記事 by mint » 14年前

情報が少なくてすみません。

C言語です。

データの形式において、各行で列数が違うので、具体的なscanfの構文の書き方が分かりません。

もし各行の列数が4で同じならば、

fscanf(fp,"%d %d %d %d\n",&a,&b,&c,%d)

のように書けると思うのですが。

画像

バグ

Re:scanfを用いたデータの読み込みについて

#4

投稿記事 by バグ » 14年前

最大列数、最大行数が固定なのかどうかで方法が変わります。
例えば、最大列数100、最大行数1000みたいに決めることは可能ですか?
そうでなければ、まずはファイル内の情報から最大列数と最大行数を決めなければいけません。

mint

Re:scanfを用いたデータの読み込みについて

#5

投稿記事 by mint » 14年前

列数は2と4の2種類なので最大列数は4に決められます。()や~も列数に含めると最大列数は7です。(このデータは編集可能なので、~などの削除も可能です。)

最大行数とは、各番号の()部分の行数のことですか?それとも全データの行数ですか?
前者なら最大50くらいです。
後者なら最大50×10000で500000と決められると思います。

しかし、データ情報からその最大行数を読み取る方法があるなら、それも教えて頂けると非常に助かります。このデータに関しては、最大列などが決められますが、次のデータでは変動するかもしれないので。


画像

バグ

Re:scanfを用いたデータの読み込みについて

#6

投稿記事 by バグ » 14年前

>>しかし、データ情報からその最大行数を読み取る方法があるなら、それも教えて頂けると非常に助かります。このデータに関しては、最大列などが決められますが、次のデータでは変動するかもしれないので。

一行ずつ読み出しながら、データ行だったらカウント…というのをファイルの終端まで繰り返せば最大行数は求められます。

最大列数は、前述の一行分のデータ文字列をstrtok関数などを使用してカンマで分割していけばその行のデータ数が求まりますので、全データの中で最も大きい列を保持しておけば、それが最大列数となります。

これらを算出したあとで、データ保持用の領域を動的に確保して、そこに格納していけばいいわけです。

初心者

Re:scanfを用いたデータの読み込みについて

#7

投稿記事 by 初心者 » 14年前

データの入り方~や空白、コンマなどが不規則な場合だったら
単純に考えたら一文字ずつやる方法がいいと思う。
読み込むデータを編集できるのなら、()や~、空白を
消せばもっと簡単にできるが・・・・
while((c = fgetc(fp)) != EOF){
        
    fputc(c,stdout);           //出力
    
    if((c != '(') (c != ')') &&  (c != '~') && (c != '空白')){
         
        整数がくるので配列に入れる
         桁数も考えて
    }
    if((c != ','))
          data[][m+1]  //次の列
         if(c != 改行)
                  data[n+1][]   //次の行
}
あまりいいやり方ではないと思うが。

いろいろな部分を省いて書くと
こんな感じで一文字ずつ読み込んで配列に値を入れていく。

mint

Re:scanfを用いたデータの読み込みについて

#8

投稿記事 by mint » 14年前

ありがとうございました。

ISLe

Re:scanfを用いたデータの読み込みについて

#9

投稿記事 by ISLe » 14年前

こんな感じで読み込めるかと思います。
標準入力使ってます。
#include <stdio.h>
int main(void)
{
    char buf[256];
    int n0, n1, n2, n3;
    while (fgets(buf, 256, stdin) != NULL) {
        if (sscanf(buf, "%d:%d", &n0, &n1) == 2) {
            printf("%d:%d\n", n0, n1);
        }
        if (sscanf(buf, "(%d,%d,%d~,%d)", &n0, &n1, &n2, &n3) == 4) {
            printf("(%d,%d,%d~,%d)\n", n0, n1, n2, n3);
        }
    }
    return 0;
}
応用はおまかせします。

閉鎖

“C言語何でも質問掲示板” へ戻る