使用C语言的二进制文件保存和读取struct数组

时间:2014-05-18 06:14:16

标签: 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(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;
  }

这就是我所说的

case 3:
    printf("Read picture records from disk\n");
    count= readFileToPic(file, pictureRecord, picNumber);
    printf("\n\nRead %d photos\n", count);
    //testing
    printf("\n%d\n", pictureRecord[0].location);
    break;

每次打印“读取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;

有人可以帮助我并告诉我问题在哪里吗?

2 个答案:

答案 0 :(得分:1)

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

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

这样想:如果你有一个包含指向字符串的指针的结构(例如,一个名字),那么字符串中的数据通常与结构不相连,当然它的大小也不包括在内在结构的大小。

相比之下,如果结构包含(固定大小)字符数组,那么您可以编写整个结构,因为数据与结构的其余部分是连续的,并且以数组的大小计算。

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

答案 1 :(得分:0)

这一行

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(int), 1, f);

但不是

fread(&p, sizeof(p), 1, f);

此外,我没有看到您分配内存以保留Maximun_Picture pic的位置。如果要从文件中读取10整数数组,则必须使用以下内容:

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

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