1

列データを含むファイルからのデータで埋められる FOO と呼ばれる構造があります。

JohnDoe 30 60 90 120
JaneDoe 20 40 80 160
...

typedef struct FOO {
char *name;
int  *data;
size_t datasize;

} FOO;

...そして、fillFOO(FILE *fp) と呼ばれる関数が、この構造体にスペースを割り当て、ファイルからのデータで埋めます。私は次のようなことを試してきました

formatString = myFormatStringBuilder();

次に、非常に鈍い方法で formatString を sscanf に渡します。

fscanf(fi, formatString, pointerToA_FOO->name, pointerToA_FOO->data[0], 
       pointerToA_FOO->data[1], ...); /* Argh! There has to be an easier way...*/

このファイルから読み取るためのより簡単でクリーンな方法はありますか?

4

1 に答える 1

2

簡単/きれい?この行はまったく機能しません。

fscanf(fi, formatString, pointerToA_FOO->name, pointerToA_FOO->data[0], ...

varargs は左辺値である必要があるためです。

また、常に 5 つの列がある場合はmyFormatStringBuilder()、まったく必要ありません。

FOO* f = malloc(sizeof(FOO));
f->name = malloc(100); // or whatever
f->data = malloc(4*sizeof(int));
fscanf(fi, "%s %u %u %u %u", f->name, &f->data[0], 
         &f->data[1], &f->data[2], &f->data[3]);

編集:わかりました。列の数はファイルごとに同じではありません。できることは次のとおりです: まず、最初の行 (つまりgetline ) を読み取り、スペースの数を数えて、ファイル内の列数を調べます4fscanf(fi, "%s", f->name);for(int i=0; i<spaces; ++i) { fscanf(fi, "%u", &f->data[i]); }

于 2013-02-14T21:42:08.493 に答える