C语言中用二进制文件保存和读取结构数组

C语言中用二进制文件保存和读取结构数组,c,arrays,struct,C,Arrays,Struct,我的阅读功能有一些问题 我的阅读功能是: int readFileToPic(FILE* f, pic* picture_Reccord, int picNumber){ int count = 0; f = fopen("Record.dat", "rb"); if (f == NULL){ printf("\n Unable to open file!\n"); } else{ count= fread(&picture_Reccord, sizeof

我的阅读功能有一些问题

我的阅读功能是:

int readFileToPic(FILE* f, pic* picture_Reccord, int picNumber){

 int count = 0;

 f = fopen("Record.dat", "rb");

 if (f == NULL){
    printf("\n Unable to open file!\n");
 }
 else{
    count= fread(&picture_Reccord, sizeof(picture_Reccord), Maximun_Picture,    f);
    fclose(f);
 }
 if (count <=0 && count >= Maximun_Picture)
    return -1;

  //breaking the programe
  //picture_Reccord[count].fileName[0] = '\n';

 return count;
  }
它每次打印“读取4张照片”,并在测试部分进行抓取

这是我的保存功能,以防出现问题

void savePic(FILE* f, pic picture_Record){

f= fopen("Record.dat","wb");
if (f == NULL)
{
    printf("\nError! Not able to save!\n");
}

fwrite(&picture_Record, sizeof(picture_Record), 1, f);
fclose(f);

printf("One Pic Saved\n");
}

这是我的更新结构,感谢@Jonathan Leffler

typedef struct picture_Data
{
char fileName[Input_Length_fileName];
char description[Input_Length_description];
char location[Input_Length_fileName];
int peopleCount;
}pic;

有谁能帮助我并告诉我问题出在哪里吗?

当您的结构包含指针时,它不能被合理地“序列化”。也就是说,不能使用任何函数(如
fwrite()
)编写

你问,为什么不呢?好问题

可以这样想:如果您有一个包含指向字符串(例如名称)指针的结构,那么字符串中的数据通常与该结构不连续,并且它的大小当然不包括在结构的大小中

相反,如果结构包含一个(固定大小)字符数组,则可以写入整个结构,因为数据与结构的其余部分相邻,并计入数组大小

灵活阵列成员需要稍微小心,但可以写入磁盘,前提是主结构记录灵活阵列的大小。您可以在一个操作中写入,但需要在两个操作中读取。第一次读取读取结构的不灵活部分;中的一个数据项告诉您要分配多少空间和要读取多少数据。

此行

count= fread(&picture_Reccord, sizeof(picture_Reccord), Maximun_Picture, f);
这绝对是错误的。这是必须的

count= fread(picture_Reccord, sizeof(pic), Maximun_Picture, f);
举一个简单的例子来看看两者的区别。假设你有:

int i;
int* ip = &i;
当您要将文件中的整数读入
i
时,需要使用

fread(&i, sizeof(int), 1, f);

但不是

fread(&p, sizeof(p), 1, f);
另外,我看不出您在哪里分配了内存来保存
最大图片
pic
s。如果要从文件中读取
10
整数数组,则必须使用以下方法:

int* ip = malloc(10*sizeof(int));
fread(ip, sizeof(int), 10, f);

如果不为
Maximun_Picture
pic
s分配内存,您将使用未经授权的内存,这将导致未定义的行为。

打开编译器警告。除非
Maximum_Picture
为负数,否则地球上没有任何可能
count=Maximun_Picture
可能是真的。而且,第一个函数中的
和Picture_Reccord
应该是
Picture_Reccord
,因为它已经是一个指针。@user3477950是的,它应该是|而不是&,thanksIt将有助于了解结构的定义。如果它包含指针,则无法使用
fwrite()
将其写入磁盘,并使用
fread()
将其读回。您的问题是,您的结构包含指针,因此无法使用
fwrite()
明智地将其写入磁盘。
fread(&p, sizeof(p), 1, f);
int* ip = malloc(10*sizeof(int));
fread(ip, sizeof(int), 10, f);