| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 917 人关注过本帖
标题:每次选择显示 添加 删除 修改功能时都会关闭程序,,,,可能我的读取文件函 ...
只看楼主 加入收藏
Aries777
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-9-25
结帖率:0
收藏
已结贴  问题点数:10 回复次数:4 
每次选择显示 添加 删除 修改功能时都会关闭程序,,,,可能我的读取文件函数写的有问题,求大神帮我看看
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct record
{
    int num;//序号
    char name[20];
    char units[30];//单位
    char del[20];//固定电话
    char phone[20];
    char add[20];//地址
    char QQ[20];
    char EMAIL[30];
    char note[20];//分类(例如同事、朋友、同学、家人)
    struct record *next;
}*p,*head,*last,*p1,*p2,*p3;
void writefile(struct record *d)//写入文件
{
    FILE *fp;
    fp=fopen("e:\\a.txt","w+");
    for(p=d;p!=NULL;p=p->next)
    {
        fprintf(fp,"%d %s %s %s %s %s %s %s %s\n",p->num,p->name,p->units,p->del,p->phone,p->add,p->QQ,p->EMAIL,p->note);
    }
    fclose(fp);
}
struct record *readfile()//读取文件
{   
    FILE *fp;
    fp=fopen("e:\\a.txt","r");
    head=NULL;
    p=(struct record *)malloc(sizeof(struct record));
    p=head;
    rewind(fp);
    while(!feof(fp))
    {  
       fscanf(fp,"%d %s %s %s %s %s %s %s %s",&p->num,p->name,p->units,p->del,p->phone,p->add,p->QQ,p->EMAIL,p->note);
       p->next=NULL;
       p1=(struct record *)malloc(sizeof(struct record));
       p->next=p1;
       p=p1;
    }
    return head;
    fclose(fp);
}
void shuru()//输入函数
{   
    int c;
    head=NULL;
    last=NULL;
    scanf("%d",&c);
    while(c!=0)
    {
        p=(struct record *)malloc(sizeof(struct record));
        scanf("%s %s %s %s %s %s %s %s",p->name,p->units,p->del,p->phone,p->add,p->QQ,p->EMAIL,p->note);
        p->num=c;
        p->next=NULL;
        if(head==NULL)
        {head=p;last=p;}
        else
        {last->next=p;last=p;}
        scanf("%d",&c);
    }
    writefile(head);
}
void seen()//显示信息的函数
{
    int i=0;
    *head=*readfile();
    for(p=head;p!=NULL;p=p->next)
    {
        printf("%d %s %s %s %s %s %s %s %s\n",p->num,p->name,p->units,p->del,p->phone,p->add,p->QQ,p->EMAIL,p->note);
        i++;
        if(i%10==0)
        {printf("请按任意键继续\n");getch();}//实现自动分屏功能
    }
}
void sort1(int num)//按序号查找
{
    *head=*readfile();
    for(p=head;p!=NULL;p=p->next)
    {   if(num==p->num)
        {printf("%d %s %s %s %s %s %s %s %s\n",p->num,p->name,p->units,p->del,p->phone,p->add,p->QQ,p->EMAIL,p->note);
         break;}
    }
    if(p==NULL)
        printf("未查到此人\n");
}
void sort2(char name[20])//按姓名查找
{
    *head=*readfile();
    for(p=head;p!=NULL;p=p->next)
    {   if(strcmp(name,p->name)==0)
        {printf("%d %s %s %s %s %s %s %s %s\n",p->num,p->name,p->units,p->del,p->phone,p->add,p->QQ,p->EMAIL,p->note);
        break;}
    }
    if(p==NULL)
        printf("未查到此人\n");
}
void sort3(char del[20])//按固定电话查找(移动电话、地址、QQ、EMAIL同理)
{
    *head=*readfile();
    for(p=head;p!=NULL;p=p->next)
    {   if(strcmp(del,p->del)==0)
        {printf("%d %s %s %s %s %s %s %s %s\n",p->num,p->name,p->units,p->del,p->phone,p->add,p->QQ,p->EMAIL,p->note);
        break;}
    }
    if(p==NULL)
        printf("未查到此人\n");
}
void sort4(char note[20],int num)//按分类和序号查找
{
    *head=*readfile();
    for(p=head;p!=NULL;p=p->next)
    {   if(strcmp(note,p->note)==0&&num==p->num)
        {printf("%d %s %s %s %s %s %s %s %s\n",p->num,p->name,p->units,p->del,p->phone,p->add,p->QQ,p->EMAIL,p->note);
        break;}
    }
    if(p==NULL)
        printf("未查到此人\n");
}
void insert(struct record *q)//添加信息函数
{
    *head=*readfile();
    p1=p2=head;
    while(p1!=NULL&&q->num<p1->num)
    {
        p2=p1;p1=p1->next;
    }
    if(p1==head)
    {q->next=head;head=q;}
    else
    {
        q->next=p1;p2->next=q;
    }
    writefile(head);
}
void dele(char name[20])//删除信息函数
{
    *head=*readfile();
    p1=p=head;
    while(p!=NULL&&strcmp(name,p->name)==0)
    {p1=p;p=p->next;}
    if(p==NULL)
        printf("没有找到要删除的信息\n");
    else if(p==head)
    {head=p->next;}
    else
    {p1->next=p->next;}
    writefile(head);
   
}
void revise(struct record *q,int num)//修改信息函数
{
    *head=*readfile();
    for(p=head;p!=NULL;p=p->next)
    {
        if(p->num==num)
        {p->num=q->num;strcpy(p->name,q->name);strcpy(p->units,q->units);strcpy(p->del,q->del);
        strcpy(p->phone,q->phone);strcpy(p->add,q->add);strcpy(p->QQ,q->QQ);
        strcpy(p->EMAIL,q->EMAIL);strcpy(p->note,q->note);
        }
    }
    writefile(head);
}
void menu()//菜单,可以返回菜单
{   int a,b,num;
    char name[20];
    char del[20];
    char note[20];
    printf("1.输入 2.显示 3.查找 4.添加 5.删除 6.修改\n");
    scanf("%d",&a);
    p3=NULL;
    switch(a)
    {
    case 1:shuru();break;
    case 2:seen();break;
    case 3:printf("请选择查找方式:1.按序号查找 2.按姓名查找 3.按固定电话查找 4.按分类和序号查找\n");
        scanf("%d",&b);
        switch(b)
        {
        case 1:printf("请输入要查找的序号:");
               scanf("%d",&num);
               sort1(num);break;
        case 2:printf("请输入要查找的姓名:");
               scanf("%s",name);
               sort2(name);break;
        case 3:printf("请输入要查找的固定电话:");
               scanf("%s",del);
               sort3(del);break;
        case 4:printf("请输入要查找的类别及序号:");
               scanf("%s%d",note,&num);
               sort4(note,num);break;
        default:break;
        }break;
    case 4:printf("请输入要添加的新纪录:");
           scanf("%d%s%s%s%s%s%s%s%s",&p3->num,p3->name,p3->units,p3->del,p3->phone,p3->add,p3->QQ,p3->EMAIL,p3->note);
           insert(p3);break;
    case 5:printf("请输入要删除的姓名为:");
           scanf("%s",name);
           dele(name);break;
    case 6:printf("请输入要修改的序号为:");
           scanf("%d",&num);
           printf("请继续输入修改后的内容为:");
           scanf("%d%s%s%s%s%s%s%s%s",&p3->num,p3->name,p3->units,p3->del,p3->phone,p3->add,p3->QQ,p3->EMAIL,p3->note);
           revise(p3,num);break;
    default:printf("error\n");break;
    }
}
int main()
{
    int x;
    printf("请选择是否开启通讯录功能:1.是 0.否(直接退出)\n");
    scanf("%d",&x);
    for(;x!=0;)
    {menu();
    printf("请选择是否开启通讯录功能:1.是 0.否(直接退出)\n");
    scanf("%d",&x);
    }//可以返回菜单
    return 0;
}



每次选择显示 添加 删除 修改功能时都会关闭程序,,,,可能我的读取文件函数写的有问题,求大神帮我看看
2016-09-25 10:14
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
发现你的读取程序没被调用过。
2016-09-25 10:32
Aries777
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-9-25
收藏
得分:0 
回复 2楼 ehszt
我的读取程序好像写的有点问题,我刚刚改了,但是还是运行不了。
struct record *readfile()//读取文件
{   
    FILE *fp;
    fp=fopen("e:\\a.txt","r");
    head=NULL;
    while(fscanf(fp,"%d",&p->num)!=EOF)
    {  
       p=(struct record *)malloc(sizeof(struct record));
       fscanf(fp,"%s %s %s %s %s %s %s %s",p->name,p->units,p->del,p->phone,p->add,p->QQ,p->EMAIL,p->note);
       p->next=NULL;
       if(head==NULL)
       {head=p;}
       else
       {p1=(struct record *)malloc(sizeof(struct record));
       p->next=p1;
       p=p1;}
    }
    fclose(fp);
    return head;
}
2016-09-25 10:41
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:5 
struct record *readfile()//读取文件
{   
    FILE *fp;
    fp=fopen("e:\\a.txt","r");
    head=NULL;
    p=(struct record *)malloc(sizeof(struct record));
    p=head;                    //这里改成head=p
    rewind(fp);

head的有你这样用的吗。又是链表头结点的指针,用完了就变成读取文件链表的头指针。
其它没错最好,有错就自己改。没兴趣看下去。
2016-09-25 13:38
Aries777
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-9-25
收藏
得分:0 
回复 4楼 linlulu001
谢谢
2016-09-25 14:16
快速回复:每次选择显示 添加 删除 修改功能时都会关闭程序,,,,可能我的读取 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017800 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved