我的阅读功能存在一些问题。
我的阅读功能是:
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;
有人可以帮助我并告诉我问题在哪里吗?
答案 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
分配内存,您将使用未经授权的内存,这将导致未定义的行为。