在C中构建格式字符串

时间:2013-02-14 21:23:20

标签: c file-io format

我有一个名为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...*/

是否有更简单/更清晰的方式来读取此文件?

1 个答案:

答案 0 :(得分:2)

更容易/清洁器?这条线根本不起作用:

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

因为varargs应该是l值。

此外,如果总共有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,然后为每一行找出文件中有多少列:{{1 }和fscanf(fi, "%s", f->name);