我想读取一个由结构体组成的二进制文件,而这些结构体又由一个结构体数组组成。
这是我的两个结构:
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
...
你不能简单地向文件中写入一个指针并期望能够像那样读回它;相反,您需要将数据序列化到文件中,例如像这样(未经测试等,不要盲目相信这一点):
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()
函数来填充它们。