mixiの「C言語C++言語」ってコミュニティを見てたんだ。

はじめまして。
CSVファイルをカンマで区切ったデータを以下のような構造体に格納したいの
ですが、いい方法が見つかりません。

typedef struct st{
 char data01[5];
 char data02[8];
 char data03[3];
 char data04[5];
 char data05[8];
 char data06[8];
 char data07[9];
 char data08[10];
 char data09[5];
 char data10[4];
 char data11[5];
 char data12[7];
:
:
}ST;

すでにつっこみどころがあるけど、とりあえずふむふむ。

この構造体のメンバ名の数字の部分をインクリメントして
while分の中で以下のように格納していきたいのですが
C言語で可能でしょうか。CSVをカンマで区切ることはできたのですが
構造体に格納するのがうまくいきません。

ふむふ……む、むぅ?

main(void)
{
ST st;
int i = 1;
char buf[10];

while (1)
{

//sprintf(buf,"st.data%02d",i);
//i++;
strcpy(,);

}
}

構成自体を変えてもらっても全然かまいませんので、
ループの中で構造体のchar型メンバに上から順に格納する方法があれば
どんな方法でもよろしいので、ぜひご指導お願い致します。

や、同じメンバ名なら、二次元配列にすればいいんじゃないかなぁ……データ構造が悪いんだろ……
データ構造さえ変えればスマートに出来るだろうに、とか思ってコメント見てたら吹いた。

csv形式ファイルから取り出す関数は出来ているものとして、
また、メンバの数は100とする。
ファイルのオープン、リードのエラー処理は無視。

//CSVファイルのオープン
void OpenCSV();

//CSVファイルのクローズ
void CloseCSV();

//CSVファイルからデータを順次取り出す関数
void GetCSV(char *setbuf);

#include
#include

#define MEMC_CT 100

typedef struct {
 char data01[5];
 char data02[8];
 char data03[3];
 char data04[5];
 char data05[8];
 char data06[8];
 char data07[9];
 char data08[10];
 char data09[5];
 char data10[4];
 char data11[5];
 char data12[7];
  :
  :
}ST;

ST st;

char *tblp[MEMB_CT] = {
     st.data01, st.data02,
      ・
      ・
};

int main()
{
 int ct;

 OpenCSV();
 
 for(ct=0; ct

前提がそもそも悪いけど、データ構造変えずにマンパワー頼みでやるとか……おかしーだろ……

こういうのはメタデータをうまく定義するのが肝だ。
#include
#include

#define ARRAY_SIZE(a) (sizeof(a)/sizeof*(a))

int DataRow_ColWidth[]={5,8,3,5,8,8,9,10,5,4,5,7};
typedef struct st{
 char* data[ARRAY_SIZE(DataRow_ColWidth)];
 char real_data[ 5+8+3+5+8+8+9+10+5+4+5+7 ];
} ST;

void ST_init(ST* st){
 int col;
 int next =0;
 for(col=0;col

はははは、笑ってやんよ。これは素晴らしいジョークだ。

こんなの用意して
#include // offsetofを使うために必要

const static size_t st_ofs[] = {
offsetof(ST, data01),
offsetof(ST, data02),
offsetof(ST, data03),
:
};

こんな感じでどうですか?
ST st;
int i;

for(i = 0; i < 5; i++) {
strcpy(&((char*)&st)[st_ofs[i]], コピー元);
}

offsetofは知らなかったわ。でもよっぽどじゃない限り、いらない子の予感。
このソースちゃんと動きそうだけど、ややっこしいなぁ……それにマンパワー頼りなのは変わらないし。


もうchar *data[]でいいじゃんよ……配列各個にmallocあたりで適当にメモリとればいいじゃんよ……ちと開放が面倒だけど。