C言語関係掲示板

過去ログ

No.146.トークンごとに構造体に格納


No.928

構造体へのデータの格納
投稿者---初心者(2002/01/25 16:35:51)


いつもお世話さまです。
今回、また分からないことがありましたで、ご教授願えればと思います。

CSV形式のファイルからデータをバッファに1件読み込み
そのデータをトークンごとに構造体のメンバにセットする方法を
教えてもらえないでしょうか。

単純な方法としては、

token = strtok( string, seps );
strcpy(メンバ1,token);

token = strtok( NULL, seps );
strcpy(メンバ2,token);

token = strtok( NULL, seps );
strcpy(メンバ3,token);

という方法が思い浮かぶのですが、メンバの数が多い場合には
実用的ではないと思います・・・。

何か効率の良い方法がありましたらよろしくお願いします。

それと、ファイルのデータが複数件ある場合は
データを読み込むバッファは使い回すので
メンバには実体をコピーする方向でお願いします。

*CSVファイルは可変長
*構造体のメンバはchar型で、サイズは不定。

初心者のため、的を射ない質問をしているかもしれませんが
どうかよろしくお願いします。





No.935

Re:構造体へのデータの格納
投稿者---B.Smith(2002/01/25 19:27:13)


こんにちは。

効率良く構造体のメンバにデータをコピーしたいということですが、構造体のメンバにコピーするには、各メンバ毎にstrcpyを使用しなければなりません。構造体のポインタを使用して相対的な位置を求める方法もありますが、貴方以外の人がソースを読む可能性がある場合は、あまりお勧めできる方法ではありません。
ここでは、ポインタの配列を使用した例をご紹介します。
例
typedef struct  {
    char    Data1[256+1];
    char    Data2[256+1];
    char    Data3[256+1];
    char    Data4[256+1];
} DATA;

#define     MAX_MEMBER      4

void    GetData(char *Record,DATA *Out)
{
    char            *tk;
    char            *Pointer[MAX_MEMBER],**pOut;
    static char     *token = ",\r\n";

    Pointer[0] = Out->Data1;    Pointer[1] = Out->Data2;
    Pointer[2] = Out->Data3;    Pointer[3] = Out->Data4;

    pOut = Pointer;

    tk = strtok(Record,token);
    while(tk){
        strcpy(*(pOut++),tk);
        tk = strtok(NULL,token);
    }
}

上記の例では、各メンバのポインタを、ポインタの配列に格納し、その配列を順番に参照することにより構造体へのコピーを行っています。ポインタの配列へ各メンバのポインタをセットしなければならないので、メンバが多い場合は処理が長くなりますが、少なくてもコピー部分はスッキリさせることができます。

しかし、この方法は、本当の意味での効率性はありません。
関数strtokを使う方法で、マシン側の見地として一番効率が良いのは、貴方が挙げた方法です。
    token = strtok( string, seps );
    strcpy(メンバ1,token);

    token = strtok( NULL, seps );
    strcpy(メンバ2,token);

    token = strtok( NULL, seps );
    strcpy(メンバ3,token);




No.958

Re:構造体へのデータの格納
投稿者---初心者(2002/01/28 09:15:10)


早速の回答ありがとうございます。
やはり、見易さなどの点も含めると

token = strtok( string, seps );
strcpy(メンバ1,token);

token = strtok( NULL, seps );
strcpy(メンバ2,token);

token = strtok( NULL, seps );
strcpy(メンバ3,token);

という方法が一番みたいですね。
いろいろとありがとうございました。

B.Smithさんの回答はいつも分かりやすく
大変参考になります。
これからもお世話になることがあると思いますが
いろいろとよろしくお願いします。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.03.06
Copyright(c) 2000-2002 TOMOJI All Rights Reserved