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);