求助大佬

关于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,这个也是正确的,因为我只写入了一组,但也不排除巧合的可能性


大佬们能帮我解答下这个问题吗
花了好几个小时都没找到问题所在
人快要傻掉了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值