ZhouRou9
2020-12-24 00:24
采纳率: 100%
浏览 21

帮忙修改C语言的一个校友信息管理系统

几个函数存在问题,价格可以私聊。

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

18条回答 默认 最新

  • 在黎明的反思 2020-12-25 10:42
    已采纳

    void xiugai()
    {
        int i,j,n,c,num;
        char name[50]={},cc[1000]={};
        FILE *fp;
        fp=fopen("D:\\DATA\\data.txt","w+");   //首先这个w+打开方式,会清空文件内容
        if(NULL==fp)
        {
            printf("文件打开失败!\n");
            return;
        }
        int N=0;
        while(!feof(fp))
        {
            fread(&per[N],sizeof(person),1,fp);  // 这里读取的数据是空的,因为w+方式打开时已经清空了里面内容,这里读取一次就结束了N==1最后
            N++; 
        }
        printf("请输入你要修改信息的校友姓名:");
        gets(name);
        getchar();
        for(i=0;i<N;i++)    //N=1
        {
            if(strcmp(name,per[i].name)==0)
                num=i;  //除非你名称输入空否则不会进入这里,这的num前面没有初始化是个异常值,
        } 
        printf("请输入你要修改哪一项信息:\n1.入校年份\n2.在校身份\n3.所在系别\n4.研究领域\n5.简介\n6.成就1\n7.成就2\n8.成就3\n");
        getchar();
        scanf("%d",&n);
        printf("请输入修改后的信息内容:");
        fflush(stdin);
        switch(n)
        {
        case 1:{ scanf("%d",&per[num].nianfen); break;} //这里修改的per[num],由于num是个异常,不知道修改的是第几个,很大很大可能不是per[0]
        case 2:{ gets(cc); strcpy(per[num].positon,cc); break;}
        case 3:{ gets(cc); strcpy(per[num].yuanxi,cc); break;}
        case 4:{ gets(cc); strcpy(per[num].lingyu,cc); break;}
        case 5:{ gets(cc); strcpy(per[num].jianjie,cc); break;}
        case 6:{ gets(cc); strcpy(per[num].chengjiu1,cc); break;}
        case 7:{ gets(cc); strcpy(per[num].chengjiu2,cc); break;}
        case 8:{ gets(cc); strcpy(per[num].chengjiu3,cc); break;}
        }
        for(i=0;i<N;i++)
            if(fwrite(&per[i],sizeof(person),1,fp)!=1)  //这里写入的就是空的数据per[0],N==1,所以写完数据为空。
                printf("写入失败!");
        fclose(fp);
    }

    已采纳该答案
    打赏 评论
  • 在黎明的反思 2020-12-24 10:21

    什么问题,贴出来?可以帮你看看

    打赏 评论
  • ZhouRou9 2020-12-24 23:39

    void xiugai()
    {
        int i,j,n,c,num;
        char name[50]={},cc[1000]={};
        FILE *fp;
        fp=fopen("D:\\DATA\\data.txt","w+");
        if(NULL==fp)
        {
            printf("文件打开失败!\n");
            return;
        }
        int N=0;
        while(!feof(fp))
        {
            fread(&per[N],sizeof(person),1,fp);
            N++;
        }
        printf("请输入你要修改信息的校友姓名:");
        gets(name);
        getchar();
        for(i=0;i<N;i++)
        {
            if(strcmp(name,per[i].name)==0)
                num=i;
        }
        printf("请输入你要修改哪一项信息:\n1.入校年份\n2.在校身份\n3.所在系别\n4.研究领域\n5.简介\n6.成就1\n7.成就2\n8.成就3\n");
        getchar();
        scanf("%d",&n);
        printf("请输入修改后的信息内容:");
        fflush(stdin);
        switch(n)
        {
        case 1:{ scanf("%d",&per[num].nianfen); break;}
        case 2:{ gets(cc); strcpy(per[num].positon,cc); break;}
        case 3:{ gets(cc); strcpy(per[num].yuanxi,cc); break;}
        case 4:{ gets(cc); strcpy(per[num].lingyu,cc); break;}
        case 5:{ gets(cc); strcpy(per[num].jianjie,cc); break;}
        case 6:{ gets(cc); strcpy(per[num].chengjiu1,cc); break;}
        case 7:{ gets(cc); strcpy(per[num].chengjiu2,cc); break;}
        case 8:{ gets(cc); strcpy(per[num].chengjiu3,cc); break;}
        }
        for(i=0;i<N;i++)
            if(fwrite(&per[i],sizeof(person),1,fp)!=1) 
                printf("写入失败!");
        fclose(fp);
    }

     

    读出之后,存不回去,也就是执行这个函数之后文件就空了T T

    打赏 评论
  • ZhouRou9 2020-12-25 12:51

    为什么名称不输入空就没办法进入判断呢

    打赏 评论
  • 在黎明的反思 2020-12-25 19:54

    因为你读取数据是空的啊,所以per里面的名称就是空的,只有空的与空的比较才相等的嘛!具体的你可以试下,文件读不出来数据per里面数据没有变,那就要看你是怎么初始化per的了。

    打赏 评论
  • ZhouRou9 2020-12-27 00:40

    void xiugai()
    {
        int i,j,n,c,num=0;
        char name[50]={},cc[1000]={};
        FILE *fp;
        fp=fopen("D:\\DATA\\data.txt","r");
        if(NULL==fp)
        {
            printf("文件打开失败!\n");
            return;
        }
        int N=0;
        while(!feof(fp))
        {
            fread(&per[N],sizeof(person),1,fp);
            N++;
        }
        fp=fopen("D:\\DATA\\data.txt","w");
        printf("请输入你要修改信息的校友姓名:");
        gets(name);
        getchar();
        for(i=0;i<N;i++)
        {
            if(strcmp(name,per[i].name)==0)
                num=i;
        }
        printf("请输入你要修改哪一项信息:\n1.入校年份\n2.在校身份\n3.所在系别\n4.研究领域\n5.简介\n6.成就1\n7.成就2\n8.成就3\n");
        getchar();
        scanf("%d",&n);
        printf("请输入修改后的信息内容:");
        fflush(stdin);
        switch(n)
        {
        case 1:{ scanf("%d",&per[num].nianfen); break;}
        case 2:{ gets(cc); strcpy(per[num].positon,cc); break;}
        case 3:{ gets(cc); strcpy(per[num].yuanxi,cc); break;}
        case 4:{ gets(cc); strcpy(per[num].lingyu,cc); break;}
        case 5:{ gets(cc); strcpy(per[num].jianjie,cc); break;}
        case 6:{ gets(cc); strcpy(per[num].chengjiu1,cc); break;}
        case 7:{ gets(cc); strcpy(per[num].chengjiu2,cc); break;}
        case 8:{ gets(cc); strcpy(per[num].chengjiu3,cc); break;}
        }
        for(i=0;i<N;i++)
            if(fwrite(&per[i],sizeof(person),1,fp)!=1) 
                printf("写入失败!");
        fclose(fp);
    }

    我把他改成了这样,但是现在修改某个信息的话(比如我改在校身份)都是新建一个人,然后这个人没有任何信息,只有一个在校身份,就像图片里这样,这是为什么呢

    打赏 评论
  • ZhouRou9 2020-12-27 00:44

    alt

    打赏 评论
  • ZhouRou9 2020-12-27 00:46

    哦不对,上面是因为我用了个别的函数,如果单独用这个修改函数的话,就只能改第一个人的数据,我改的是第三个人,但是现在第一个人的身份变学生了,是不是判断名字是否相同那里有问题

    打赏 评论
  • qq_53753247 2020-12-27 15:10

    同学哪个学校的呀

    打赏 评论
  • qq_53753247 2020-12-27 15:10

    我们也在做这个,好奇是不是校友

    打赏 评论
  • ZhouRou9 2020-12-27 18:43

    大连某工大学

    打赏 评论
  • qq_53753247 2020-12-27 19:58

    我也我也!

    打赏 评论
  • qq_53753247 2020-12-27 19:58

    师从?

    打赏 评论
  • 在黎明的反思 2020-12-28 18:32

    我直接给你说怎么调试吧!你把写入的地方都打印出来看看,不就知道了,printf大法,哪里比对打印哪里出来看看

    打赏 评论
  • 在黎明的反思 2020-12-28 18:34

    还有就是第二次打开文件先把前面打开的关闭了,再打开不然很容易句柄使用完了,到后面你打不开文件了

    打赏 评论
  • 在黎明的反思 2020-12-28 18:34

    养成好习惯

    打赏 评论
  • 在黎明的反思 2020-12-28 18:35

    还可以使用gdb调试

    打赏 评论
  • ZhouRou9 2020-12-29 13:55

    好的

    打赏 评论

相关推荐 更多相似问题