C语言成绩管理系统如何输出信息

如题,编写的output函数用于输出已储存在文件中的学生信息。尽管文件中有信息,但是程序无法输出。这个该如何解决呢?
代码如下:

#include
#include
#include


int n=0;
struct Student{       //设置结构体变量,储存学生信息
   int id;            //学号
   char name[10];     //姓名
   char gender[10];   //性别
   int age;           //年龄
   int MathAna;       //数学分析成绩
   int LiAlg;         //高等代数成绩
   int Computer;      //程序设计成绩
   int English;       //大学英语成绩
   float GPA;         //平均学分绩GPA
};

struct Student st[100];
void menu();          //菜单
void count();
void input();         //输入学生信息
void output();        //输出学生信息

int main()
{
    int i;
    menu();           //调用菜单函数,显示菜单界面
    scanf("%d",&i);   //输入数字,进入不同功能
    while(i)
    {
        switch(i){
        case 1: input(); break;
        case 8: output(); break;
        default: break;
        }
    menu();    
    scanf("%d",&i);
    }
}


void menu()   //该函数用于实现菜单界面
{
    printf("\n\n\n\n");
     printf("\t\t|***************学生信息管理系统***************|\n");
     printf("\t\t|\t\t\t\t\t       |\n");
     printf("\t\t|\t\t 1.输入学生信息\t               |\n");
     printf("\t\t|\t\t 2.修改学生信息\t               |\n");
     printf("\t\t|\t\t 3.查询学生信息\t               |\n");
     printf("\t\t|\t\t 4.按GPA排序\t               |\n");
     printf("\t\t|\t\t 5.按性别统计\t               |\n");
     printf("\t\t|\t\t 6.按年龄统计\t               |\n");
     printf("\t\t|\t\t 7.显示挂科学生信息\t       |\n");
     printf("\t\t|\t\t 8.显示所有学生信息\t       |\n");
     printf("\t\t|\t\t 9.删除学生信息\t               |\n");
     printf("\t\t|\t\t 0.退出系统\t\t       |\n");
     printf("\t\t|\t\t\t\t\t       |\n");
     printf("\t\t|**********************************************|\n\n");
     printf("请您选择操作(0-9):");
}


void count()
{
    struct Student stu1;
    FILE * fp; //定义一个文件指针fp
    fp = fopen("students.txt", "at+"); //以"追加"方式打开students文本文件
    if (fp == NULL) //判断文件是否为空
        printf("Cannot open file!");
    int n = 0; //初始化
    while (1)
    {
        if (feof(fp)) //检测文件是否结束
        break;
        fread( & stu1, sizeof(struct Student), 1, fp); //读取文件
        n++; //读取文件数
    }
    n--; //关闭文件数
    fclose(fp); //关闭文件
}


void input()  //该程序用于实现输入学生信息
{
    int i = 0; //学生人数初始化//
    char c;
    FILE * fp; //定义一个文件指针fp//
    count(); //实时检测总数n//
    fp = fopen("students.txt", "at+"); //以"追加"方式打开students文本文件
    do
    {
        printf("请输入学生的个人信息:\n");
        printf("\n请输入第%d位学生的信息:\n", n + 1);
        printf("请输入学生的学号:");
        scanf("%d", &st[i].id);
        printf("请输入学生的姓名:");
        getchar(); 
        scanf("%s", st[i].name);  
        printf("请输入学生的性别:");
        getchar();
        scanf("%s",st[i].gender); 
        printf("请输入学生的年龄:");
        scanf("%d",&st[i].age);
        printf("请输入学生的数学分析成绩:");
        scanf("%d", &st[i].MathAna);
        printf("请输入学生的高等代数成绩:");
        scanf("%d", &st[i].LiAlg);
        printf("请输入学生的程序设计成绩:");
        scanf("%d",&st[i].Computer);
        printf("请输入学生的大学英语成绩:");
        scanf("%d", &st[i].English);
        printf("请输入学生的GPA:");
        scanf("%f",&st[i].GPA);
        
        fwrite( & st[i], sizeof(struct Student), 1, fp); //以方式将其写入students文本文件
        i++;
        n++;
        printf("\n\n\t\t\t\t是否继续输入(Y/N):");
        getchar(); //提示是否继续,从键盘获得一个字符
        scanf("%c", &c);
    }
    while ( c == 'y' || c == 'Y');
    fclose(fp);
}


void output()   //该程序用于实现输出学生信息
{
    int i;
    char c;
    FILE * fp; //定义一个文件指针fp
    fp = fopen("students.txt", "rt"); //以"读取的" 方式打开students文本文件
    printf("|#学号\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
    do {
        for (i = 0; i < n; i++)
        {
            fread(&st[i], sizeof(struct Student), 1, fp);
            printf(" %d ", st[i].id);
            printf(" %s ", st[i].name);
            printf(" %s ", st[i].gender);
            printf(" %d ", st[i].age);
            printf(" %d ", st[i].MathAna);
            printf(" %d ", st[i].LiAlg);
            printf(" %d ", st[i].Computer);
            printf(" %d ", st[i].English);
            printf(" %f \n", st[i].GPA);
        }
        printf("\n\n\t\t\t\t是否继续其它操作(Y/N):"); //提示是否继续
        scanf("%c", &c);
        c = getchar();
    } while ( c == 'y' || c == 'Y');
    fclose(fp); //关闭文件
}

运行结果如下图:

img

运行程序后直接进入菜单8,此时n=0的循环没有执行。改为判断feof。
对应的input中初始化i为n,int i = n;

void output() // 该程序用于实现输出学生信息
{
    int i;
    char c;
    FILE *fp;                         // 定义一个文件指针fp
    fp = fopen("students.txt", "rt"); //"读取的" 方式打开students文本文件

    printf("|#学号\t姓名\t性别\t年龄\t数学分析\t高等代数\t程序设计\t大学英语\tGPA\t#|\n");
    // do
    // {
    for (i = 0; !feof(fp); i++, n++)
    {
        fread(&st[i], sizeof(struct Student), 1, fp);
        printf(" %d ", st[i].id);
        printf(" %s ", st[i].name);
        printf(" %s ", st[i].gender);
        printf(" %d ", st[i].age);
        printf(" %d ", st[i].MathAna);
        printf(" %d ", st[i].LiAlg);
        printf(" %d ", st[i].Computer);
        printf(" %d ", st[i].English);
        printf(" %f \n", st[i].GPA);
    }
    //     printf("\n\n\t\t\t\t是否继续其它操作(Y/N):"); // 提示是否继续
    //     scanf("%c", &c);
    //     c = getchar();
    // } while (c == 'y' || c == 'Y');
    fclose(fp); // 关闭文件
}

修改如下,改动处见注释,供参考:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int n=0;
struct Student{       //设置结构体变量,储存学生信息
   int id;            //学号
   char name[10];     //姓名
   char gender[10];   //性别
   int age;           //年龄
   int MathAna;       //数学分析成绩
   int LiAlg;         //高等代数成绩
   int Computer;      //程序设计成绩
   int English;       //大学英语成绩
   float GPA;         //平均学分绩GPA
};

struct Student st[100];

void menu();          //菜单
void count();
void input();         //输入学生信息
void output();        //输出学生信息
void output1(); //修改

int main()
{
    int i;
    count(); //修改
    menu();           //调用菜单函数,显示菜单界面
    scanf("%d",&i);   //输入数字,进入不同功能
    while(i)
    {
        switch(i){
          case 1: input(); break;
          case 8: output1();break; //两种输出方式 修改
                //output();break;
          default: break;
        }
        menu();
        scanf("%d",&i);
    }
}

void menu()   //该函数用于实现菜单界面
{
    printf("\n\n\n\n");
     printf("\t\t|***************学生信息管理系统***************|\n");
     printf("\t\t|\t\t\t\t\t       |\n");
     printf("\t\t|\t\t 1.输入学生信息\t               |\n");
     printf("\t\t|\t\t 2.修改学生信息\t               |\n");
     printf("\t\t|\t\t 3.查询学生信息\t               |\n");
     printf("\t\t|\t\t 4.按GPA排序\t               |\n");
     printf("\t\t|\t\t 5.按性别统计\t               |\n");
     printf("\t\t|\t\t 6.按年龄统计\t               |\n");
     printf("\t\t|\t\t 7.显示挂科学生信息\t       |\n");
     printf("\t\t|\t\t 8.显示所有学生信息\t       |\n");
     printf("\t\t|\t\t 9.删除学生信息\t               |\n");
     printf("\t\t|\t\t 0.退出系统\t\t       |\n");
     printf("\t\t|\t\t\t\t\t       |\n");
     printf("\t\t|**********************************************|\n\n");
     printf("请您选择操作(0-9):");
}

void count()
{
    int  i = 0;//修改
    FILE * fp;
    fp = fopen("students.txt", "r"); //修改
    if (fp == NULL) //判断文件是否为空
        printf("Cannot open file!\n");
    else{
        while (1)
        {
            if (fread(&st[i], sizeof(struct Student), 1, fp) != 1)  break;//读取文件
            i++; //读取文件数
        }
        n = i;  //修改
        fclose(fp); //关闭文件
    }
}

void input()  //该程序用于实现输入学生信息
{
    int i = n; //i = 0;修改
    char c;
    FILE * fp;
               //count(); //修改
    fp = fopen("students.txt", "at+"); //以"追加"方式打开students文本文件
    do
    {
        printf("请输入学生的个人信息:\n");
        printf("\n请输入第%d位学生的信息:\n", n + 1);
        printf("请输入学生的学号:");
        scanf("%d", &st[i].id);
        printf("请输入学生的姓名:");
        getchar(); 
        scanf("%s", st[i].name);
        printf("请输入学生的性别:");
        getchar();
        scanf("%s",st[i].gender);
        printf("请输入学生的年龄:");
        scanf("%d",&st[i].age);
        printf("请输入学生的数学分析成绩:");
        scanf("%d", &st[i].MathAna);
        printf("请输入学生的高等代数成绩:");
        scanf("%d", &st[i].LiAlg);
        printf("请输入学生的程序设计成绩:");
        scanf("%d",&st[i].Computer);
        printf("请输入学生的大学英语成绩:");
        scanf("%d", &st[i].English);
        printf("请输入学生的GPA:");
        scanf("%f",&st[i].GPA);
        
        fwrite(&st[i], sizeof(struct Student), 1, fp); //以方式将其写入students文本文件
        i++;
        n++;
        printf("\n\n\t\t\t\t是否继续输入(Y/N):");
        getchar(); //提示是否继续,从键盘获得一个字符
        scanf(" %c", &c);
    }
    while ( c == 'y' || c == 'Y');
    fclose(fp);
}

void output()   //该程序用于实现输出学生信息  修改
{
    struct Student tmp;
    FILE * fp; //定义一个文件指针fp
    fp = fopen("students.txt", "rt"); //以"读取的" 方式打开students文本文件
    if (fp == NULL)
        printf("Cannot open file!\n");
    else{
        printf("|#学号\t姓名\t性别\t年龄 数学分析 高等代数 程序设计 大学英语 GPA\t#|\n");
        while (1) {
            if (fread(&tmp, sizeof(struct Student), 1, fp) != 1) break;
            printf(" %d\t", tmp.id);
            printf(" %s\t", tmp.name);
            printf(" %s\t", tmp.gender);
            printf(" %d\t", tmp.age);
            printf(" %d\t", tmp.MathAna);
            printf(" %d\t", tmp.LiAlg);
            printf(" %d\t", tmp.Computer);
            printf(" %d\t", tmp.English);
            printf(" %f \n",tmp.GPA);
        }
        fclose(fp); //关闭文件
    }
}

void output1() //该程序用于实现输出学生信息  修改
{
    int i;
    for (i = 0; i < n; i++)
    {
        if (i == 0)
            printf("|#学号\t姓名\t性别\t年龄 数学分析 高等代数 程序设计 大学英语 GPA\t#|\n");
        printf(" %d\t", st[i].id);
        printf(" %s\t", st[i].name);
        printf(" %s\t", st[i].gender);
        printf(" %d\t", st[i].age);
        printf(" %d\t", st[i].MathAna);
        printf(" %d\t", st[i].LiAlg);
        printf(" %d\t", st[i].Computer);
        printf(" %d\t", st[i].English);
        printf(" %f \n", st[i].GPA);
    }
}