从 C 中的二进制文件读取内部包含结构体数组的 strcut

问题描述 投票:0回答:1

我想读取一个由结构体组成的二进制文件,而这些结构体又由一个结构体数组组成。

这是我的两个结构:

typedef struct view
{
    long CustomerID;
    int Rating;
    char Date[11];
}View;

typedef struct movie
{
    long MovieID;
    long YearOfRelease;
    char Title[MAX_LINE_SIZE];
    long CountView;
    View *Views;
}Movie;

我想要这样的东西:

void readDataFromBinary()
{
    FILE *f = NULL;
    f = fopen("../saved_data/save_data.bin", "rb");

    if (f == NULL)
    {
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    Movie movie;

    while(fread(&movie, sizeof(Movie), 1, f) != 0)
    {
        printf("MovieId : %ld\n", movie.MovieID);
        printf("YearOfRelease : %ld\n", movie.YearOfRelease);
        printf("Title : %s", movie.Title);
        printf("CountView : %ld\n\n", movie.CountView);

        for (int i = 0; i < movie.CountView; i++)
        {
             printf("%ld\n", movie.Views[i].CustomerID);
             printf("%d\n", movie.Views[i].Rating);
             printf("%s\n", movie.Views[i].Date);
        }
    }

    if (fclose(f) == -1)
    {
        perror("fclose");
        exit(EXIT_FAILURE);
    }
}

该函数适用于没有

MovieID
循环的
YearOfRealease
Title
CountView
for
,但对于
Views
的组件,我有一个
core dump
...

c struct binaryfiles
1个回答
0
投票

你不能简单地向文件中写入一个指针并期望能够像那样读回它;相反,您需要将数据序列化到文件中,例如像这样(未经测试等,不要盲目相信这一点):


void write_view(View *view, FILE *file) {
  fwrite(&view->CustomerID, sizeof(long), 1, file);
  fwrite(&view->Rating, sizeof(int), 1, file);
  fwrite(view->Date, sizeof(char), 11, file);
}

void write_movie(Movie *movie, FILE *file) {
  fwrite(&movie->MovieID, sizeof(long), 1, file);
  fwrite(&movie->YearOfRelease, sizeof(long), 1, file);
  fwrite(movie->Title, sizeof(char), MAX_LINE_SIZE, file);
  fwrite(&movie->CountView, sizeof(long), 1, file);
  for (int i = 0; i < movie->CountView; i++) {
    write_view(&movie->Views[i], file);
  }
}

然后,类似地,您将读取电影的“标题信息”,分配足够的内存

Views
,然后调用
read_view()
函数来填充它们。

© www.soinside.com 2019 - 2024. All rights reserved.