假设我想要阅读的文件的结构如下所示:
typedef struct {
char length;
char* text;
} name;
typedef struct {
long n_names;
name* names;
} file;
在文件中首先是名称数量,后跟动态长度的名称列表。所以我需要为names
数组分配内存,但在我能做到之前,我首先需要知道所有名称的长度。
我该如何解决这个问题?
答案 0 :(得分:2)
1)您可以使用动态增长的数据结构(例如,列表)并添加您在旅途中找到的名称。如果由于某种原因你不想要那样,你可以 2)运行整个文件两次并在第一次运行时确定相应的大小,然后分配你需要的内存,最后得到字符串。
请注意,在上面的示例中,sizeof(struct name)是固定的,因为text只是指向其他位置的指针。
答案 1 :(得分:1)
就像手动计算内存中字符串的大小一样。迭代直到达到null终止符,它将告诉您到达名称的末尾。然后你这样做直到你达到EOF。
答案 2 :(得分:1)
一旦你读了名字的数量(n_names
),就可以malloc
足够的记忆来保存结构(例如my_file.names = malloc(sizeof(*my_file.names) * my_file.n_names);
)。
然后你可以依次遍历你的文件,malloc
依次为每个字符串记忆:
for (i = 0; i < my_file.n_names; i++)
{
int len;
fread(&len, sizeof(len), 1, fid);
my_file.names[i].text = malloc(len+1);
...
}
答案 3 :(得分:1)
如果你有多余的内存,只需分配文件的大小;否则处理文件两次:首先用于总结长度(?),然后读取名称。
答案 4 :(得分:0)
void readname(struct name* name,FILE* f)
{
fread(&name->length,1,1,f);
name->text = malloc(name->length);
fread(name->text,name->length,1,f);
}
readfile
类似,但第二个fread(...);
变为for(...) readname(...);