从二进制文件读取动态大小字符串

时间:2011-04-22 19:54:25

标签: c data-structures binaryfiles

假设我想要阅读的文件的结构如下所示:

typedef struct {
    char length;
    char* text;
} name;
typedef struct {
    long n_names;
    name* names;
} file;

在文件中首先是名称数量,后跟动态长度的名称列表。所以我需要为names数组分配内存,但在我能做到之前,我首先需要知道所有名称的长度。

我该如何解决这个问题?

5 个答案:

答案 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(...);