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


#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();
} 


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);
}

如果没输出来,那就是说文件是空的呗

打印的是结构体的数据,不是文件数据啊

fgetc改用fread
fread(pi,1,strlen(stu)+1,fp);

img


你试试

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{

    FILE *fp = fopen("www.duan", "rb");
    char c ;
    while(c!=EOF)
    {
        c = fgetc (fp);
        printf("%c",c);
    }
    //测试了是可以打印文件全部内容的
    return 0;
}