没有耐心勿进-->功能函数读写出现问题
程序代码:
/* 订餐信息处理: 主要模块:插入、修改、查询、删除、显示、文件读取、文件写入 数据结构: 链表(带头结点) 注意:程序初次运行时,不执行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 编辑 ]