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あたりで適当にメモリとればいいじゃんよ……ちと開放が面倒だけど。