没有耐心勿进-->功能函数读写出现问题
程序代码:/*
订餐信息处理:
主要模块:插入、修改、查询、删除、显示、文件读取、文件写入
数据结构:
链表(带头结点)
注意:程序初次运行时,不执行Fread_File(head)函数进行文件读取,待第一次写入数据后再向程序加入Fread_File(head)函数。
以实现每次程序运行时都能读取之前存储在文件中的数据。
*/
/*********问题*********/
/*文件读取后最后一个元素不能显示,是乱码。其它功能函数都没有问题,就是读取、写入函数出现了问题,恳请大家帮忙找错*/
/**经测试:文件读取的元素要比写入的元素多一个。问题出在文件读取函数上,大家帮我看看这个文件读取函数有什么问题。**/
#include"stdio.h"
#include"stdlib.h"
#define SIZE sizeof(Guest_List)
typedef struct guest_info
{
int num; //编号
int sum; //用餐人数
char name[20]; //姓名
char time[20]; //用餐时间
char phone[20]; //电话
struct guest_info *next;
}Guest_List;
int count=0;//全局变量,统计客人人数;
int main()
{
void Insert(Guest_List *head);
void Search(Guest_List *head);
void Update(Guest_List *head);
void Delete(Guest_List *head);
void Show(Guest_List *head);
void Fread_File(Guest_List *head);
void Fwrite_File(Guest_List *head);
int n;
Guest_List *head;
head=(Guest_List *)malloc(SIZE);
head->next=NULL;
Fread_File(head); //程序运行时从文件读取信息
do
{
printf("\n");
printf("1-----插入(Insert)\n");
printf("2-----查询(Search)\n");
printf("3-----修改(Update)\n");
printf("4-----删除(Delete)\n");
printf("5-----显示(Show)\n");
printf("6-----退出(Exit)\n");
printf("请选择菜单:");
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1:Insert(head);break;
case 2:Search(head);break;
case 3:Update(head);break;
case 4:Delete(head);break;
case 5:Show(head);break;
case 6:break;
default:printf("输入错误,请重新选择!\n");
}
}while(n!=6);
Fwrite_File(head); //程序结束前将信息写入文件
return 0;
}
//插入信息
void Insert(Guest_List *head)
{
Guest_List *cur,*pre,*New_code;
int number;
pre=cur=head->next;
printf("请输入编号:");
scanf("%d",&number);
while(cur!=NULL&&cur->num!=number)
{
pre=cur;
cur=cur->next;
}
if(cur!=NULL)
{
printf("已有相同的编号!\n");
return;
}
New_code=(Guest_List *)malloc(SIZE);
New_code->next=NULL;
if(New_code==NULL)
{
printf("分配空间失败!\n");
return ;
}
if(pre==NULL)
head->next=New_code;
else
pre->next=New_code;
New_code->num=number;
printf("请输入姓名:");
scanf("%s",New_code->name);
printf("请输入用餐人数:");
scanf("%d",&New_code->sum);
printf("请输入用餐时间:");
scanf("%s",New_code->time);
printf("请输入联系号码:");
scanf("%s",New_code->phone);
count++;
}
//查询信息<按编号查询>
void Search(Guest_List *head)
{
Guest_List *cur;
int number;
cur=head->next;
printf("请输入您要查询的编号:");
scanf("%d",&number);
while(cur->num!=number&&cur->next!=NULL)
cur=cur->next;
if(cur->num==number)
{
printf("姓名:%s\n",cur->name);
printf("用餐人数:%d\n",cur->sum);
printf("用餐时间:%s\n",cur->time);
printf("联系人号码:%s\n",cur->phone);
}
else
printf("您要查询的编号不存在!\n");
}
//修改信息
void Update(Guest_List *head)
{
Guest_List *cur;
int number;
cur=head->next;
printf("请输入您要修改的编号:");
scanf("%d",&number);
while(cur->num!=number&&cur->next!=NULL)
cur=cur->next;
if(cur->num==number)
{
printf("请输入用餐人数:");
scanf("%d",&cur->sum);
printf("请输入用餐时间:");
scanf("%s",cur->time);
}
else
printf("您要修改的编号不存在!\n");
}
//删除信息
void Delete(Guest_List *head)
{
Guest_List *cur,*pre;
int number;
pre=head;
cur=head->next;
printf("请输入您删除的编号:");
scanf("%d",&number);
while(cur!=NULL&&cur->num!=number)
{
pre=cur;
cur=cur->next;
}
if(cur!=NULL)
{
pre->next=cur->next;
free(cur);
count--;
}
else
printf("您要删除的编号不存在!\n");
}
//显示信息
void Show(Guest_List *head)
{
Guest_List *cur;
cur=head->next;
if(cur==NULL)
{
printf("现在暂无订单!\n");
return;
}
while(cur!=NULL)
{
printf("编号:%d 姓名:%s 用餐人数:%d 用餐时间:%s 联系人号码:%s\n",
cur->num,cur->name,cur->sum,cur->time,cur->phone);
cur=cur->next;
}
printf("当前订单:%d\n",count);
}
//读取文件
void Fread_File(Guest_List *head)
{
//int n=0;(此部分注释为测试用)
FILE *fp;
Guest_List *cur,*pre;
pre=cur=(Guest_List *)malloc(SIZE);
head->next=cur;
pre->next=NULL;
if((fp=fopen("Guest.dat","rb"))==NULL)
{
printf("加载失败,文件不存在!\n");
getchar();
exit(0);
}
while(!feof(fp))
{ //n++;
fread(cur,SIZE,1,fp);
pre->next=cur;
pre=cur;
cur=(Guest_List *)malloc(SIZE);
}
//printf("%d\n",n);
pre->next=NULL;
fclose(fp);
}
//写入文件
void Fwrite_File(Guest_List *head)
{
FILE *fp;
if((fp=fopen("Guest.dat","wb"))==NULL)
{
printf("加载失败,文件不存在!");
getchar();
exit(0);
}
for(head=head->next;head!=NULL;head=head->next)
fwrite(head,SIZE,1,fp);
fclose(fp);
}
[ 本帖最后由 a4811 于 2013-1-12 23:00 编辑 ]









