| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1962 人关注过本帖
标题:来个大神帮我看看,输入输出哪里错了?记录不了信息
只看楼主 加入收藏
Xiaoming1
Rank: 1
等 级:新手上路
帖 子:11
专家分:1
注 册:2016-5-13
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:14 
来个大神帮我看看,输入输出哪里错了?记录不了信息
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int n=0;                                  //定义一个全局变量n



//定义结构体
struct huiyuan
{
    int kahao;                            //卡号
    char xingming[15];                    //姓名
    int dengji;                           //会员等级
    float zhekoulv;                       //会员折扣率
};struct huiyuan huiyuan[9];              //结构体变量数组



//定义菜单
int caidan()
{
    int m;
    printf("欢迎使用博文产品\n\n\n\n\n\n");
    printf("\t************************主页**************************\n");
    printf("\t*  1.会员卡信息录入功能;                            *\n");
    printf("\t*  2.会员卡信息整体预览功能;                        *\n");
    printf("\t*  3.按卡号查询会员卡信息;                          *\n");
    printf("\t*  4.按输入的“会员等级”统计该等级会员卡的数量信息;*\n");
    printf("\t*  5.修改某一“会员等级”的折扣率的值的信息;        *\n");
    printf("\t*  6.按照输入的“会员姓名”信息删除该会员信息;      *\n");
    printf("\t*  7.根据“折扣率”由小到大排序;                    *\n");
    printf("\t*  8.退出系统;                                      *\n");
    printf("\t******************************************************\n");
    scanf("%d",&m);
    return m;
}


//会员卡信息录入功能

   

void lvru()
{
    FILE *p;                             
    if((p=fopen("shuju.dat","ab"))==NULL)                                //打开“shuju.dat”文件并判断是否成功打开
    {
        printf("无法打开/建立文件");
        return;
    }
    fseek(p,n*sizeof(struct huiyuan),0);                                 //指定指针当前指向位置
    int a;
    for(n;;n++)                                                          //用for语句重复录入会员信息
    {
        printf("请输入会员信息\n");
        printf("\t卡号\t姓名\t会员等级\t折扣率\t\n");
        printf("\n请输入卡号:");
        scanf("%d",&huiyuan[n].kahao);
        printf("\n请输入姓名:");
        scanf("%s",huiyuan[n].xingming);
        printf("\n请输入等级:");
        scanf("%d",&huiyuan[n].dengji);
        printf("\n请输入折扣率:");
        scanf("%f",&huiyuan[n].zhekoulv);
        if(fwrite(&huiyuan[n],sizeof(struct huiyuan),1,p)!=1)              //将信息写入“shuju.dat”文件中并判断是否成功写入
        {
            printf("执行失败");
            return;
        }
        printf("\n继续录入会员请按1,否则请按任意键");            
        scanf("%d",&a);
        if(a!=1)
        {
            fclose(p);                                                     //关闭文件“shuju.dat”
            break;                                                         //跳出循环
        }
    }
    n++;                                                                   //用break强制跳出循环时最后一次不执行n++,所以这里给他加上
    printf("请输入任意键回到菜单\n");
    scanf("%d",&a);
}

//会员卡信息整体预览功能   

void yulan()
{
    FILE *p;
    if((p=fopen("shuju.dat","rb"))==NULL)                                   //只读方式打开文件并判断是否正常打开
    {
        printf("无法打开文件");
        exit(0);
    }
    int a,b;
    printf("\t卡号\t姓名\t会员等级\t折扣率\t\n");
    for(a=0;a<n;a++)
    {
        fread(&huiyuan[a],sizeof(struct huiyuan),1,p);                       //将文件中的数据一个结构体一个结构体的赋值到结构体变量数组上
        printf("\t%d\t%s\t%d\t\t%0.2f\n",huiyuan[a].kahao,huiyuan[a].xingming,huiyuan[a].dengji,huiyuan[a].zhekoulv);
    }
    fclose(p);                                                               //使用完后关闭文件
    printf("请输入任意键回到菜单\n");
    scanf("%d",&b);
}

//按卡号查询会员卡信息  

void chaxun()
{
    FILE *p;
    if((p=fopen("shuju.dat","rb"))==NULL)                                     //只读方式打开文件并判断是否正常打开
    {
        printf("无法打开该文件");
        exit(0);
    }
    int a,b;
    printf("请输入卡号");
    scanf("%d",&b);
    for(a=0;a<n;a++)                                                           //用for语句把文件的数据赋给结构体变量数组,并找出所查找会员的信息,然后跳出循环
    {
        fread(&huiyuan[a],sizeof(struct huiyuan),1,p);
        if(b==huiyuan[a].kahao)
        {
            printf("\t卡号\t姓名\t会员等级\t折扣率\t\n");
            printf("\t%d\t%s\t%d\t\t%0.2f\n",huiyuan[a].kahao,huiyuan[a].xingming,huiyuan[a].dengji,huiyuan[a].zhekoulv);
        }
        if(b==huiyuan[a].kahao)break;
    }
    if(a==n)
        printf("\n查无此人");
    fclose(p);                                                                    //关闭文件
        printf("\n请输入任意输回到菜单");
        scanf("%d",&a);
}

//按输入“会员等级”统计该等级会员卡的数量信息

void tongji()
{
    FILE *p;
    if((p=fopen("shuju.dat","rb"))==NULL)
    {
        printf("无法打开该文件");
        exit(0);
    }
    int a,b,c=0;
    printf("请输入会员卡等级:");
    scanf("%d",&a);                                                                //a记录所查找的等级,c记录该会员等级总人数
    printf("\t卡号\t姓名\t会员等级\t折扣率\t\n");
    for(b=0;b<n;b++)
    {
        fread(&huiyuan[b],sizeof(struct huiyuan),1,p);
        if(a==huiyuan[b].dengji)
        {
            printf("\t%d\t%s\t%d\t\t%0.2f\n",huiyuan[b].kahao,huiyuan[b].xingming,huiyuan[b].dengji,huiyuan[b].zhekoulv);
            c++;
        }
    }
    fclose(p);
    printf("该等级共有%d\n",c);
    printf("请输入任意键回到菜单\n");
    scanf("%d",&a);
}

//修改某一“会员等级”的折扣率的值的信息;

void xiugai()
{
    FILE *p;
    if((p=fopen("shuju.dat","rb"))==NULL)                                               
    {
        printf("无法打开该文件");
        exit(0);
    }
    int a,b=0,c,e=-1;
    float d,f;
    printf("请输入所需修改的扣率的等级:");
    scanf("%d",&a);
    fread(&huiyuan[0],sizeof(struct huiyuan),1,p);
    while(a!=huiyuan[b].dengji)                                                         //用循环一一给结构体变量数组赋值,并找出该等级会员卡当前折扣率
    {
        b++;
        fread(&huiyuan[b],sizeof(struct huiyuan),1,p);
    }
    fclose(p);
    printf("该会员等级当前扣率为:%f\n",huiyuan[b].zhekoulv);
    printf("确认修改请按1,返回主菜单请输入其他数:");
    scanf("%d",&c);
    if((p=fopen("shuju.dat","ab+"))==NULL)
    {
        printf("无法打开文件");
        return;
    }
    if(c==1)
    {
        printf("请输入新扣率:");
        scanf("%f",&d);
        for(e=0;e<n;e++)
        {
            fseek(p,e*sizeof(struct huiyuan),0);                                          //重新定义指针位置
            fread(&huiyuan[e],sizeof(struct huiyuan),1,p);                                //定义完后开始对结构体变量数组赋值
            if(a==huiyuan[e].dengji)  
            {
                huiyuan[e].zhekoulv=d;                                                    //找出该等级的人并逐一修改折扣率
                fwrite(&huiyuan[e],sizeof(struct huiyuan),1,p);                           //修改完后重新写入文件
            }
        }
    }
    printf("查看当前该等级扣率请输入1,返回主菜单请输入其他数:");
    scanf("%f",&f);
    if(f==1)
    {
        e=-1;
        do
        {
            e++;
            fseek(p,e*sizeof(struct huiyuan),0);
            fread(&huiyuan[e],sizeof(struct huiyuan),1,p);
        }while(a!=huiyuan[e].dengji);
        fclose(p);
        printf("%f\n",huiyuan[e].zhekoulv);
        printf("按任意键返回主菜单:");
        scanf("%d",&a);
    }
}


//按照输入的“会员姓名”信息删除该会员信息;

void shanchu()
{
    FILE *p;
    if((p=fopen("shuju.dat","ab+"))==NULL)
    {
        printf("无法打开文件");
        exit(0);
    }
    rewind(p);
    int a=-1,b,c,x;
    char d[15];
    printf("请输入会员名字:");
    scanf("%s",d);
    for(x=0;x<n;x++)
        fread(&huiyuan[x],sizeof(struct huiyuan),1,p);
    printf("该会员信息为\n");
    do                                                                                //找出该会员并记录该会员所在“位置”
    {
        a++;
        if(a>=n)
        {
            printf("输入有误,请重新输入:");
            scanf("%s",d);
            a=-1;
        }
            
    }while(strcmp(huiyuan[a].xingming,d)!=0);
    printf("\t卡号\t姓名\t会员等级\t折扣率\t\n");
    printf("\t%d\t%s\t%d\t\t%0.2f\n",huiyuan[a].kahao,huiyuan[a].xingming,huiyuan[a].dengji,huiyuan[a].zhekoulv);
    printf("\n\n确认删除请输入1,取消删除返回主菜单请输入其他数:");
    scanf("%d",&b);
    if(b==1)
    {
        for(a;a<n;a++)                                                                //用覆盖的方法删除该会员信息,并使后面的会员往前移中间不留下空隙
        {
            huiyuan[a].kahao=huiyuan[a+1].kahao;
            *huiyuan[a].xingming=*huiyuan[a+1].xingming;                     
            huiyuan[a].dengji=huiyuan[a+1].dengji;
            huiyuan[a].zhekoulv=huiyuan[a+1].zhekoulv;
        }
        n--;
        rewind(p);
        for(a=0;a<n;a++)
            fwrite(&huiyuan[a],sizeof(struct huiyuan),1,p);
        fclose(p);
        printf("删除完毕,请输入任意数返回主菜单:");
        scanf("%d",&c);
    }
}



//根据“折扣率”由小到大排序

void paixu()
{
    FILE *p;
    if((p=fopen("shuju.dat","ab+"))==NULL)
    {
        printf("无法打开文件");
        exit(0);
    }
    rewind(p);
    int a,b,c,e,x;
    for(x=0;x<n;x++)
        fread(&huiyuan[x],sizeof(struct huiyuan),1,p);
    rewind(p);
    float d;
    char q[15];
    for(a=0;a<n;a++)
    {
        for(b=0;b<n-a;b++)
        {
            if(huiyuan[a].zhekoulv>huiyuan[b].zhekoulv)
            {
                c=huiyuan[a].kahao;huiyuan[a].kahao=huiyuan[b].kahao;huiyuan[b].kahao=c;
                *q=*huiyuan[a].xingming;*huiyuan[a].xingming=*huiyuan[b].xingming;*huiyuan[b].xingming=*q;
                c=huiyuan[a].dengji;huiyuan[a].dengji=huiyuan[b].dengji;huiyuan[b].dengji=c;
                d=huiyuan[a].zhekoulv;huiyuan[a].zhekoulv=huiyuan[b].zhekoulv;huiyuan[b].zhekoulv=d;
            }
        }
    }
    for(x=0;x<n;x++)
        fwrite(&huiyuan[x],sizeof(struct huiyuan),1,p);
    fclose(p);
    printf("排序已完成,查看列表请输入1,返回主菜单请输入其他数:");
    scanf("%d",&e);
    if(e==1)
        yulan();
}


void tuichu()
{
    printf("\n\n\t\t谢谢使用!!!\n\t\t  再见!\n");
    exit(0);
}






   


      

void main()
{
    int o,r;
    printf("是否建立新档案,是请输入1,不是请输入其他数:");
    scanf("%d",&r);
    if(r==1)
    {
        FILE *p;
        if((p=fopen("shuju.dat","wb"))==NULL)
        {
            printf("建立失败");
            exit(0);
        }
        fclose(p);
    }
    while(1)
    {
        o=caidan();
        switch(o)
        {
        case 1:lvru();break;
        case 2:yulan();break;
        case 3:chaxun();break;
        case 4:tongji();break;
        case 5:xiugai();break;
        case 6:shanchu();break;
        case 7:paixu();break;
        case 8:tuichu();break;
        }
    }
}
搜索更多相关主题的帖子: include 结构体 折扣率 会员 记录 
2016-06-09 16:54
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:20 
你再次启动之后全局变量n从哪里来啊?如果你的操作全都基于文件是不是应该先确定文件里面有几个数据啊?
2016-06-09 17:06
Xiaoming1
Rank: 1
等 级:新手上路
帖 子:11
专家分:1
注 册:2016-5-13
收藏
得分:0 
回复 2楼 Xiaoming1
对哦,应该把n也存进去;你说的文件确定信息,那个要声明吗?我看书上好像都不用声明的。
2016-06-09 17:09
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
我指的是你既然基于文件进行操作,按照你的逻辑,非重新创建数据就应该先读一下看看文件里有多少个数据借此来确定n。

另外一个问题就是你的数组大小是固定的,如果超过9个怎么办呀。
再看看你的查询等等的函数,是不是有必要使用数组啊?你是从文件里一次性全部读到内存里再输出还是读一个打印一个呀?那能不能改进一下让他超过9个也没有问题呀?
2016-06-09 17:16
Xiaoming1
Rank: 1
等 级:新手上路
帖 子:11
专家分:1
注 册:2016-5-13
收藏
得分:0 
回复 3楼 随风飘荡
顺便问一下,我该如何实现这个n下次重新启动时已经有上次的值,而且他还是个全局变量?
2016-06-09 17:17
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
你自己不是已经想到了吗?
2016-06-09 17:20
Xiaoming1
Rank: 1
等 级:新手上路
帖 子:11
专家分:1
注 册:2016-5-13
收藏
得分:0 
回复 5楼 随风飘荡
9个数据组这个问题不大,我可以把变量数组的大小改一下就可以实现更多的记录人数,因为文件输入输出这些内容是自己看书,有些东西不怎么理解,至于你说的定义文件的大小以及信息,这个书上好像没说有,只是让直接建立一个数据文件记好文件名直接拿来读写。n的话是不是可以运行前先读文件看看文件有多少组数据来确定n值?还是怎样?
2016-06-09 17:22
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
n可以读一遍数一下,也可以直接把n存进去,直接存效率高,但是后面的fseek你就要注意了。或者你也可以专门使用一个文件来保存n,这样就可以避免fseek的问题。

数组这个问题我不是说你多大合适,看看你录入数据是不是先输入一个人的所有信息,然后直接就写进文件了。
那么数组真的是有必要的吗?同样的道理,那么别的呢?
2016-06-09 17:27
Xiaoming1
Rank: 1
等 级:新手上路
帖 子:11
专家分:1
注 册:2016-5-13
收藏
得分:0 
回复 9楼 随风飘荡
读一遍n就+1,什么时候知道他读完?判断的条件是什么?告诉一下我,书上好像没说;另外你说数组的问题是huiyuan【9】这里吧?的确是输入一个人的信息就写一个人的信息进去,但是每个huiyuan数组里面又有多个元素,比如有姓名卡号什么的,这个数组就不能去掉了吧?去掉的话只能记录一个信息,姓名或者卡号或者等级,不能全部一起写进去。你说的这个数组问题可能我理解不了,结构体跟文件输入输出这两章书全是自学,而且只给了一天时间看,会用,但是有些不怎么能理解。
2016-06-09 17:33
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
fread是有返回值的,返回fread成功读取的个数。

数组这个问题你要再看看结构体到底是什么。
2016-06-09 17:42
快速回复:来个大神帮我看看,输入输出哪里错了?记录不了信息
数据加载中...
 
   



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

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