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], ...

因为可变参数应该是左值。

此外,如果总是有 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)并计算空格数来找出文件中有多少列,然后 malloc 那而不是4,然后对于每一行:fscanf(fi, "%s", f->name);for(int i=0; i<spaces; ++i) { fscanf(fi, "%u", &f->data[i]); }

于 2013-02-14T21:42:08.493 回答