我有一个结构
struct object{
double x, y, size;
int ident;
}
和函数
int object_read_from_file(struct object* s, FILE* f);
从 .txt 文件的一行读取一些数据并将其保存在结构对象中。 P.e.:“0.1894 0.3442 0.9 26”可能是 .txt 文件的一行。
这些都在文件“object.c”中。
在文件“main.c”中,我现在必须实现,从一个大型 .txt 文件中读取所有对象,其中包含许多名为“arg[3]”的行(在程序启动之前未知),并将它们保存在数组中“对象”按照读入的顺序排列。
我的第一次尝试是这样的:
FILE* f = fopen(arg[3], "r");
struct object s;
int x = 0;
s* objects;
objects = calloc(1, sizeof(struct object));
while(object_read_from_file(&s, f) !=0)
{
objects[x].x = s->x;
objects[x].y = s->y;
objects[x].size = s->size;
objects[x].ident = s->ident;
objects = realloc(objects, ((x+1) * (sizeof(struct object))));
x++;
}
fclose(f);
我知道这里没有保存到我的数组“对象”。那是因为我现在在编译时已经有多个错误,例如“->”是无效的类型参数,并且“对象”未声明。我完全不知道我做错了什么,我很想获得一些帮助,或者以其他方式而不是我的方式更好地解决任务。
最佳答案
代码必须是:
FILE* f = fopen(arg[3], "r");
struct object s;
int x = 0;
struct object * objects = malloc(0);
while(object_read_from_file(&s, f) !=0)
{
objects = realloc(objects, ((x+1) * (sizeof(struct object))));
objects[x].x = s.x;
objects[x].y = s.y;
objects[x].size = s.size;
objects[x].ident = s.ident;
x++;
}
fclose(f);
第一个malloc在这里允许之后realloc,并且realloc必须在之前完成保存新条目。当然因为s不是指针->
必须替换为。
如果在fopen之后最好检查一下f是否不是NULL
考虑到object的定义,您可以使用memcpy来设置s中的新条目
关于c - 解决结构数组及其中的 realloc 的一些建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56225791/