DaBaiD 发表于 2020-7-2 08:37:41

怎么样把这两个功能改成读取文本文件中的数据

stu * lookdata(        stu *p1)   //查看数据的函数
{
    printf("\n\t\t\t☆☆☆显示数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    while(p1!=NULL)
    {
      printf("姓名:%s\n",p1->name);
      printf("学号:%s\t",p1->num);
      printf("性别:%s\t",p1->sex);
      printf("地址:%s\t",p1->address);
      printf("政治面貌:%s\t",p1->political);
      printf("手机号:%s\t",p1->phone);
      printf("QQ号:%s\t",p1->QQ);
      printf("宿舍:%s\n",p1->dorm);
      printf("邮编:%s\n",p1->PC);
      printf("Email:%s\n",p1->Email);
      printf("======================================================================\n");
      p1=p1->next;
    }
    return p1;
}












find(stu *p2)      //通过姓名查找查看数据的函数
{
    char name;
    int b=0;
    printf("\n\t\t\t☆☆☆查看数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    printf("请输入您想查找人的姓名:");
    scanf("%s",name);
    while(p2!=NULL)
    {
      if(strcmp(name,p2->name)==0)
      {
            printf("你要找到的数据\n");
            printf("姓名:%s\n",p2->name);
            printf("学号:%s\t",p2->num);
            printf("性别:%s\t",p2->sex);
            printf("地址:%s\t",p2->address);
            printf("政治面貌:%s\t",p2->political);
            printf("手机号:%s\t",p2->phone);
            printf("QQ号:%s\t",p2->QQ);
            printf("宿舍:%s\n",p2->dorm);
            printf("邮编:%s\n",p2->PC);
            printf("Email:%s\n",p2->Email);
            printf("======================================================================\n");
            b=1;
      }
      p2=p2->next;
    }
    if(b==0)
    {
      printf("\n您要查找的人不存在!\n");
    }
}

jhanker 发表于 2020-7-2 09:55:43

对照下面代码看看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*-----信息存储区-----*/

struct Caipin{
    char cai;
    int price;
}caipin={      //7种菜品
    {"steak",50},{"lamb",30},{"bacon",25},{"chicken",30},
    {"vegetable",15},{"meatball",20},{"lobster",100}
};

struct Zhushi{
    char zhu;
    int price;
}zhushi={      //5种主食
    {"rice",5},{"cake",3},{"noodles",7},
    {"jiaozi",20},{"bun",10}
};

struct Yinliao{
    char yin;
    int price;
}yinliao={       //5种饮料
    {"juice",3},{"coca-cola",5},{"tea",20},
    {"coffee",15},{"milk",7}
};

struct VIP{         //用链表形式保存会员信息
    char name;
    char tel;
    struct VIP *next;
};


/*-----函数声明区-----*/
float diancan();
float choice_caipin();
float choice_zhushi();
float choice_yinliao();

int jiesuan(struct VIP *infor,float sum);
struct VIP *check_huiyuan(struct VIP *infor,char *input);

int huiyuan(struct VIP **infor);
void getInput(struct VIP *infor);
void huiyuan_upload(struct VIP **xinxi);
void huiyuan_print(struct VIP *infor);
void huiyuan_delete(struct VIP **infor);
void saveVIP(struct VIP *xinxi);

struct VIP *readVIP();

/*-----主函数区-----*/
int main()
{
    struct VIP *infor;
    infor = readVIP();
   // saveVIP(infor);
    printf("欢迎使用XX餐厅前台管理系统\n");
    printf("请选择您需要的服务项目:\n");
    printf("1\t点餐\n2\t结算\n3\t会员卡管理\n");
    int temp=0;
    float sum = 0;
    while(1){
      scanf("%d",&temp);
      switch(temp)
      {
            case 1:sum = diancan();break;       //进入点餐界面
            case 2:jiesuan(infor,sum);break;          //进入结算系统
            case 3:huiyuan(&infor);break;             //进入会员管理系统
            default:printf("输入错误!请重新输入");
      }
    }
    return 0;
}

/*-----点餐函数区-----*/
float diancan()
{
    printf("欢迎点餐!\n");
    printf("请选择:\n1\t菜品\n2\t主食\n3\t饮料\n0\t返回主菜单\n");
    int temp;
    float sum = 0;
    while(1){
      scanf("%d",&temp);
      switch(temp)
      {
            case 1:
            sum += choice_caipin();
            printf("请选择:\n1\t菜品\n2\t主食\n3\t饮料\n0\t返回主菜单\n");
            break;    //调用菜品选择函数,并计算总价格
            case 2:
            sum += choice_zhushi();
            printf("请选择:\n1\t菜品\n2\t主食\n3\t饮料\n0\t返回主菜单\n");
            break;    //调用主食选择函数,并计算总价格
            case 3:
            sum += choice_yinliao();
            printf("请选择:\n1\t菜品\n2\t主食\n3\t饮料\n0\t返回主菜单\n");
            break;   //调用饮料选择函数,并计算总价格
            case 0:printf("1\t点餐\n2\t结算\n3\t会员卡管理\n");return sum; //返回主菜单
            default:printf("输入错误!请重新输入");break;
      }
    }
}
float choice_caipin()
{
    printf("请选择菜品:\n");
    for(int i=0;i<7;i++){
      printf("%d\t%s\t\t%d\n",i+1,caipin.cai,caipin.price);
    }
    printf("输入0返回上一级\n");
    int choice;
    float sum_caipin = 0;
    while(1){
      scanf("%d",&choice);
      if(choice == 0){
            break;
      }
      for (int j=0;j<7;j++){
            if(choice == j+1){
                printf("%s已选择\n",caipin.cai);
                sum_caipin += caipin.price;
            }
      }
    }
    return sum_caipin;
}
float choice_zhushi()
{
    printf("请选择主食:\n");
    for(int i=0;i<5;i++){
      printf("%d\t%s\t\t%d\n",i+1,zhushi.zhu,zhushi.price);
    }
    printf("输入0返回上一级\n");
    int choice;
    float sum_zhushi = 0;
    while(1){
      scanf("%d",&choice);
      if(choice == 0){
            break;
      }
      for (int j=0;j<7;j++){
            if(choice == j+1){
                printf("%s已选择\n",zhushi.zhu);
                sum_zhushi += zhushi.price;
            }
      }
    }
    return sum_zhushi;
}
float choice_yinliao()
{
    printf("请选择主食:\n");
    for(int i=0;i<5;i++){
      printf("%d\t%s\t\t%d\n",i+1,yinliao.yin,yinliao.price);
    }
    printf("输入0返回上一级\n");
    int choice;
    float sum_yinliao = 0;
    while(1){
      scanf("%d",&choice);
      if(choice == 0){
            break;
      }
      for (int j=0;j<7;j++){
            if(choice == j+1){
                printf("%s已选择\n",yinliao.yin);
                sum_yinliao += yinliao.price;
            }
      }
    }
    return sum_yinliao;
}

/*-----结算函数区-----*/
int jiesuan(struct VIP *infor,float sum)
{
    printf("您本次消费 %.2f 元",sum);
    int temp = 1;
    float rate = 0.7;
    // struct VIP *infor = NULL;
    char input;
    while(temp == 1){
      printf("您是否有会员卡?\n");
      printf("1\t有\n0\t没有\n");
      scanf("%d",&temp);
      if(temp == 0){
            break;
      }else{
            printf("请输入您的手机号码:\n");
            scanf("%s",input);
            if(check_huiyuan(infor,input) != NULL){
                printf("会员卡享受7折优惠\n");
                sum *= rate;
                break;
            }else{
                printf("未查询到会员信息!请重新输入\n");
                continue;
            }
      }
    }
    printf("您应付金额为:%.2f\n",sum);
    printf("1\t点餐\n2\t结算\n3\t会员卡管理\n");
    return 0;
}
struct VIP *check_huiyuan(struct VIP *infor,char *input)             //检查会员信息是否存在
{
   
    struct VIP *xinxi;
    xinxi = infor;
    while(xinxi != NULL){
      if(strcmp(xinxi->tel,input) == 0){
            return xinxi;
      }
      xinxi = xinxi->next;
    }
    return NULL;
}

/*-----会员管理函数区-----*/
int huiyuan(struct VIP **infor)
{
    printf("欢迎进入会员管理系统\n");
    printf("请选择您需要的服务项目:\n");
    printf("1\t会员信息录入\n2\t会员信息显示\n3\t会员卡注销\n");
    printf("输入0返回上一级\n");
    int temp = 0,flag = 1;
    // struct VIP *infor = NULL;
    while(1){
      scanf("%d",&temp);
      switch(temp)
      {
            case 1:huiyuan_upload(infor);break;      //会员信息录入
            case 2:huiyuan_print(*infor);break;      //会员信息打印
            case 3:huiyuan_delete(infor) ;break;      //会员信息注销
            case 0:printf("1\t点餐\n2\t结算\n3\t会员卡管理\n");return 0;
            default:printf("输入错误!请重新输入");continue;
      }
    }
}
void getInput(struct VIP *infor)
{
    printf("请输入姓名:");
    scanf("%s",infor->name);
    printf("请输入手机号码:");
    scanf("%s",infor->tel);
    infor->next=NULL;
}
void huiyuan_upload(struct VIP **xinxi)
{
    struct VIP *infor,*temp;
    infor = (struct VIP *)malloc(sizeof(struct VIP));
    if (infor == NULL){
      printf("内存分配失败!");
      exit(1);
    }
    getInput(infor);
   
    if(*xinxi != NULL){
      temp = *xinxi;
      *xinxi = infor;
      infor->next = temp;
    }
    else{
      *xinxi = infor;
      infor->next = NULL;
    }
    saveVIP(*xinxi);
}
void saveVIP(struct VIP *xinxi)
{
    FILE *fp;
    struct VIP *infor = xinxi;
    fp = fopen("huiyuan.txt","wb+");
    if(fp == NULL){
                printf("can't open file!\n");
                exit(1);
    }
    if(infor != NULL){
      //fprintf(fp,"%s\t%s\n",infor->name,infor->tel);
                rewind(fp);
                fwrite(infor,sizeof(struct VIP),1,fp);
                while (infor->next!=NULL)
                {
         fwrite(infor->next,sizeof(struct VIP),1,fp);
         infor = infor->next;
                }
    }
    fclose(fp);

}
struct VIP *readVIP() //运行前把文件内容读取到电脑内存
{
    struct VIP *p,*q,*infor = (struct VIP *)malloc(sizeof(struct VIP));
    p = q = infor;
      FILE *fp;
   if ( (fp=fopen("huiyuan.txt", "rb+"))==NULL)
      {
      if ( (fp=fopen("huiyuan.txt", "wb+"))==NULL)
                {
                         printf("无法创建或打开"huiyuan.txt"文件\n");
                     exit(0);
                }
         return NULL;
      }
      else
      {
                if (fread(infor,sizeof(struct VIP),1,fp)!=0)
                {
                         q= (struct VIP*)malloc(sizeof(struct VIP));
                        while(fread(q,sizeof(struct VIP),1,fp)!=0)
                  {
                            p->next = q;
                              p = q;
                            q= (struct VIP*)malloc(sizeof(struct VIP));
                  }
            p->next =NULL ;
         
            }
                else
                {
                            infor=NULL;
                }
                         fclose(fp);
                     return infor;
      }
   
   
}
void huiyuan_print(struct VIP *infor)
{
    struct VIP *xinxi;
    int num = 1;
    xinxi = infor;
    while(xinxi != NULL){
      printf("Number %d:",num);
      printf("姓名:%s",xinxi->name);
      printf("手机号码:%s\n",xinxi->tel);
      xinxi = xinxi->next;
      num++;
    }
}
void huiyuan_delete(struct VIP **infor)
{
    struct VIP *xinxi,*temp;
    char input;
    printf("请输入需要删除的会员的手机号码:\n");
    scanf("%s",input);
    temp = *infor;
    xinxi = temp;
    while(xinxi != NULL){
      if(strcmp(xinxi->tel,input)==0){
                if (xinxi==*infor)
                {
                  *infor=(*infor)->next;
            free(xinxi);
                        break;
                }
                else
                {
            temp->next = xinxi->next;
                        free(xinxi);
            break;
                }
         
      }
      temp = xinxi;
      xinxi = xinxi->next;
    }
    saveVIP(*infor);
}

jhanker 发表于 2020-7-2 09:59:40

特别是下面这两个函数看看
void saveVIP(struct VIP *xinxi)
{
    FILE *fp;
    struct VIP *infor = xinxi;
    fp = fopen("huiyuan.txt","wb+");
    if(fp == NULL){
                printf("can't open file!\n");
                exit(1);
    }
    if(infor != NULL){
      //fprintf(fp,"%s\t%s\n",infor->name,infor->tel);
                rewind(fp);
                fwrite(infor,sizeof(struct VIP),1,fp);
                while (infor->next!=NULL)
                {
         fwrite(infor->next,sizeof(struct VIP),1,fp);
         infor = infor->next;
                }
    }
    fclose(fp);

}
struct VIP *readVIP() //运行前把文件内容读取到电脑内存
{
    struct VIP *p,*q,*infor = (struct VIP *)malloc(sizeof(struct VIP));
    p = q = infor;
      FILE *fp;
   if ( (fp=fopen("huiyuan.txt", "rb+"))==NULL)
      {
      if ( (fp=fopen("huiyuan.txt", "wb+"))==NULL)
                {
                         printf("无法创建或打开"huiyuan.txt"文件\n");
                     exit(0);
                }
         return NULL;
      }
      else
      {
                if (fread(infor,sizeof(struct VIP),1,fp)!=0)
                {
                         q= (struct VIP*)malloc(sizeof(struct VIP));
                        while(fread(q,sizeof(struct VIP),1,fp)!=0)
                  {
                            p->next = q;
                              p = q;
                            q= (struct VIP*)malloc(sizeof(struct VIP));
                  }
            p->next =NULL ;
         
            }
                else
                {
                            infor=NULL;
                }
                         fclose(fp);
                     return infor;
      }
   
   
}

chxchxkkk 发表于 2020-7-2 11:14:32

在函数开始部分加上读取文件的语句。当然前面输入完成时要有存储到文件的语句
页: [1]
查看完整版本: 怎么样把这两个功能改成读取文本文件中的数据