黎林晓果 2022-01-06 16:27 采纳率: 0%
浏览 72

为什么最后输出所有信息输不出来呢(中间已省略)


#include<stdio.h> 
#include<stdlib.h>
#include<string.h>
void menu();
void input();
void find();
int find_way(struct stu *pi,int a);
void exchange();
void del_go(int num);
void del();
void move();
void show_all();
FILE *fp;
struct stu 
{
    int num;
    char name[10];
    char sex[4];
    char unit[10];
    char address[15];
    char phone[11];
    float salary;
    float allowance;
    float life;
    float telBill;
    float waterBill;
    float rent;
    float income_tax;
    float cleanBill;
    float fund;
    float total_deduct;
        float realPay;
    float shouldPay;
    int number;
}*pi;
int main()
{    struct stu a;
    pi=&a;
    if ((fp = fopen("www.duan", "ab+")) == NULL)
        printf("打开文件出错!!!"), exit(0);
    menu();
    return 0;
}

void menu() {
    int num;
    system("cls");

    printf("\t\t\t|----------------------------------------|\n");
    printf("\t\t\t|        欢迎使用教师工资管理系统        |\n");
    printf("\t\t\t|               菜单列表                 |\n");
    printf("\t\t\t|           [1]添加教师信息              |\n");
    printf("\t\t\t|           [2]修改教师信息              |\n");
    printf("\t\t\t|           [3]删除教师信息              |\n");
    printf("\t\t\t|           [4]查询教师信息              |\n");
    printf("\t\t\t|           [5]查询所有教师信息          |\n");
    printf("\t\t\t|           [0]退出程序                  |\n");
    printf("\t\t\t|          请选择你要进行的项目:         |\n");
    printf("\t\t\t|----------------------------------------|\n"); 
    scanf("%d",&num);
    switch (num)
    {
    case 1:input();break;
    case 2:exchange();break;
    case 3:del();break;
    case 4:find();break;
    case 5:show_all();break;
    case 0:exit(0);break;
    default:printf("没有符合您选择的功能,请重新输入!");
    }
}


void show_all()
{FILE *fp = fopen("www.duan", "rb");
int c;
int i ;
while((c=fgetc(fp))!=EOF)
    {
        printf("教师号%d\n姓名%s\n性别%s\n单位名称%s\n家庭住址%s\n联系电话%s\n基本工资%.2f\n津贴%.2f\n生活补贴%.2f\n电话费%.2f\n水电费%.2f\n房租%.2f\n所得税%.2f\n卫生费%.2f\n公积金%.2f\n应发工资%.2f\n合计扣款%.2f\n实发工资%.2f\n",pi->num, pi->name, pi->sex, pi->unit, pi->address,pi->phone,pi->salary,pi->allowance,pi->life,pi->telBill,pi->waterBill,pi->rent,pi->income_tax,pi->cleanBill,pi->fund,pi->shouldPay,pi->total_deduct,pi->realPay);

    }

    menu();
} 


  • 写回答

5条回答 默认 最新

  • 关注

    show_all函数中,读文件跟你的pi有什么关系啊?
    pi是全局变量,你是不是在读取文件的时候已经把这个指针移动到最后了?
    而且你的while循环中,pi也没有移动,输出的永远是一个位置的元素。
    正确的逻辑应该是:
    (1)在main函数中先读取文件,然后把所有数据保存起来,pi记录结构体数组的首地址。
    (2)在show_all函数中,遍历pi指向的结构体数组就可以了(需要用一个临时变量p=pi,然后用p++遍历所有元素,因为pi是全局变量,所以不要直接用pi遍历,否则pi的值就改变了)
    代码修改如下:

    
    
    #include<stdio.h> 
    #include<stdlib.h>
    #include<string.h>
    void menu();
    void input();
    void find();
    int find_way(struct stu *pi,int a);
    void exchange();
    void del_go(int num);
    void del();
    void move();
    void show_all();
    void readfile(); //读取文件
    FILE *fp;
    struct stu 
    {
        int num;
        char name[10];
        char sex[4];
        char unit[10];
        char address[15];
        char phone[11];
        float salary;
        float allowance;
        float life;
        float telBill;
        float waterBill;
        float rent;
        float income_tax;
        float cleanBill;
        float fund;
        float total_deduct;
        float realPay;
        float shouldPay;
        int number;
    }*pi;
    int g_nmb=0; //记录实际个数
    int main()
    {    
        readfile(); //读取文件
        menu();
        return 0;
    }
    void menu() {
        int num;
        system("cls");
        printf("\t\t\t|----------------------------------------|\n");
        printf("\t\t\t|        欢迎使用教师工资管理系统        |\n");
        printf("\t\t\t|               菜单列表                 |\n");
        printf("\t\t\t|           [1]添加教师信息              |\n");
        printf("\t\t\t|           [2]修改教师信息              |\n");
        printf("\t\t\t|           [3]删除教师信息              |\n");
        printf("\t\t\t|           [4]查询教师信息              |\n");
        printf("\t\t\t|           [5]查询所有教师信息          |\n");
        printf("\t\t\t|           [0]退出程序                  |\n");
        printf("\t\t\t|          请选择你要进行的项目:         |\n");
        printf("\t\t\t|----------------------------------------|\n"); 
        scanf("%d",&num);
        switch (num)
        {
        case 1:input();break;
        case 2:exchange();break;
        case 3:del();break;
        case 4:find();break;
        case 5:show_all();break;
        case 0:exit(0);break;
        default:printf("没有符合您选择的功能,请重新输入!");
        }
    }
    
    void show_all()
    {
        struct stu* p = pi;
        int i= 0;
        while(i<g_nmb)
        {
            printf("教师号%d\n姓名%s\n性别%s\n单位名称%s\n家庭住址%s\n联系电话%s\n基本工资%.2f\n津贴%.2f\n生活补贴%.2f\n电话费%.2f\n水电费%.2f\n房租%.2f\n所得税%.2f\n卫生费%.2f\n公积金%.2f\n应发工资%.2f\n合计扣款%.2f\n实发工资%.2f\n",p->num, p->name, p->sex, p->unit, p->address,p->phone,p->salary,p->allowance,p->life,p->telBill,p->waterBill,p->rent,p->income_tax,p->cleanBill,p->fund,p->shouldPay,p->total_deduct,p->realPay);
            p++;
            i++;
        }
        menu();
    } 
    
    void readfile()
    {
        FILE *fp = fopen("www.duan", "r");
        int i=0 ;
        struct stu *p;
        pi = 0;
        g_nmb = 0;
        //假设一行中有一个结构体数据,字段之间用空格分割
        while(!feof(fp))
        {
            p = (struct stu *)malloc(sizeof(struct stu));
            if(pi==0)
                pi = p;
            fscanf(fp,"%d %s %s %s %s %s %f %f %.2f %f %f %f %f %f %f %f %f %f",&p->num, p->name, p->sex, p->unit, p->address,p->phone,&p->salary,&p->allowance,&p->life,&p->telBill,&p->waterBill,&p->rent,&p->income_tax,&p->cleanBill,&p->fund,&p->shouldPay,&p->total_deduct,&p->realPay);
            g_nmb++;
        }
        fclose(fp);
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 1月6日

悬赏问题

  • ¥15 请问Quartus的Verilog代码怎么写?
  • ¥18 光催化第一性原理计算析氢效率STH怎么计算
  • ¥100 Mac 版foxmail 收邮件问题
  • ¥15 QWebEngineView
  • ¥15 如何使用shufflenet进行手写数字识别
  • ¥15 .net core 同时编辑怎么防止数据串了
  • ¥20 微信小程序播放直播流
  • ¥15 关于迷宫自走单片机循迹小车的知识
  • ¥15 python使用selenium工具爬取网站的问题
  • ¥15 visual studio中c语言用ODBC链接SQL SERVER