关于C语言fread和fwrite的问题
各位大佬们,我是一位大一新生,最近在做课设的时候遇到了一个无法解决的问题
问题概述
就是使用fwrite函数将结构体数组写入文件后,用fread函数读取出来的始终是长串数字
因为用的是二进制文件,也没办法直观的看出是否正确写入
以下是结构体定义
typedef struct hangban
{
int num; //航班号
int dqpeo; //当前载客量
int mzpeo; //满载载客量
char qftime[40]; //起飞时间
char jltime[40]; //降落时间
char qfcity[40]; //起飞城市
char jlcity[40]; //降落城市
int money; //原票价
float discount; //折扣
};
typedef struct lb //定义链表
{
lb *prior; //上一个
hangban hb; //航班
lb *next; //下一个
};
录入信息(fwrite所在)
void luru()
{
int sf=1,i=0;
FILE *fp; //定义文件指针
hangban hb[100],k1;
if((fp=fopen("plane.bin","wb+"))==NULL)
{
printf("plane.bin文件打开失败");
exit(0);
}
printf("\n 录入信息中...\n\n");
while(sf!=0)
{
fprintf(fp,"\n\n\n");
printf("输入航班号:\n");
scanf("%d",&hb[i].num);
printf("输入当前载客量:\n");
scanf("%d",&hb[i].dqpeo);
printf("输入满载载客量:\n");
scanf("%d",&hb[i].mzpeo);
printf("输入起飞城市:\n");
getchar(); //吸收换行符
gets(hb[i].qfcity);
printf("输入降落城市:\n");
getchar();
gets(hb[i].jlcity);
printf("输入起飞时间:\n");
getchar();
gets(hb[i].qftime);
printf("输入降落时间:\n");
getchar();
gets(hb[i].jltime);
printf("输入原票价:\n");
scanf("%d",&hb[i].money);
printf("输入折扣:(以小数输入)\n");
scanf("%f",&hb[i].discount);
//写入文件
fwrite(&hb[i],sizeof(struct hangban),i+1,fp);
i++;
//判定是否结束
printf("是否继续输入?继续则输入1,结束则输入0\n");
scanf("%d",&sf);
}
rewind(fp);
fclose(fp);
}
查询信息(fread所在,卡在这里了没写完)
void chaxun()
{
lb *head,*p1,*p2,*cx;
hangban hb[100];
int a,hbh,j,i=0;
FILE *fp;
char qfct[10],jlct[10];
if((fp=fopen("plant.bin","rb+"))==NULL)
{
printf("plant.bin文件打开失败");
exit(0);
}
rewind(fp);
printf(" ┌———————————————————————————————─┐\n");
printf(" | |\n");
printf(" | 查询页面 |\n");
printf(" | 1.输入航班号查询 |\n");
printf(" | 2.输入起飞和抵达城市查询 |\n");
printf(" | |\n");
printf(" └————————————————————————————————┘\n");
printf("请输入:\n");
scanf("%d",&a);
cx=head=p1=p2=(lb*)malloc(LEN); //建立链表
if(head==NULL)
{
printf("链表创建失败\n");
exit(0);
}
while(!feof(fp))
{
fread(&hb,sizeof(struct hangban),1,fp); //读取信息
p2->hb.num=hb[i].num;
p2->hb.dqpeo=hb[i].dqpeo;
p2->hb.mzpeo=hb[i].mzpeo;
strcpy(p2->hb.qftime,hb[i].qftime);
strcpy(p2->hb.jltime,hb[i].jltime);
strcpy(p2->hb.qfcity,hb[i].qfcity);
strcpy(p2->hb.jlcity,hb[i].jlcity);
p2->hb.money=hb[i].money;
p2->hb.discount=hb[i].discount;
//建立新节点
p2=(lb*)malloc(LEN);
p1->next=p2;
p1=p2;
i++;
}
p2->next=head;
if(a==1)
{
while(1)
{
printf("输入航班号:\n");
scanf("%d",&hbh);
while(1)
{
if(hbh==cx->hb.num)
{
printf("航班号:\n%d\n",p2->hb.num);
printf("订票人数:\n%d\n",p2->hb.dqpeo);
printf("满载人数:\n%d\n",p2->hb.mzpeo);
printf("出发时间:\n%s\n",p2->hb.qftime);
printf("抵达时间:\n%s\n",p2->hb.jltime);
printf("出发城市:\n%s\n",p2->hb.qfcity);
printf("抵达城市:\n%s\n",p2->hb.jlcity);
printf("原票价\n%d\n",p2->hb.money);
printf("折扣:\n%.0f%%\n",(p2->hb.discount)*100.0);
printf("折后票价:\n%d\n",(p2->hb.money)*(p2->hb.discount));
}
else
cx=cx->next;
}
printf("是否继续查询?是则输入1,否则输入0\n");
scanf("%d",&j);
if(j==0)
break;
}
}
else
{
}
}
以下是我的一些调试过程和结果
在调试过程中发现hb[i]的值是正确的
fwrite(&hb[i],sizeof(struct hangban),i+1,fp);
这是我的输入
这是调试到fwrite时的数组
结果正确,说明数组hb[i]没问题
这是我在chaxun函数中调试fread时的结果
fread(&hb,sizeof(struct hangban),1,fp);
而且
如果在fwrite后加一个fread函数
结果一样,也都是如上图一串数字
所以应该不是自定义函数之间的问题
还有
fread和fwrite函数里的size参数,各种各样的我基本都试了一遍,结果也一样
大概率也不是这里的问题,但也不排除有的可能性
fwrite的返回值为1,这个也是正确的,因为我只写入了一组,但也不排除巧合的可能性
大佬们能帮我解答下这个问题吗
花了好几个小时都没找到问题所在
人快要傻掉了