关于“文件管理”的问题

#include
#include
#include
#include 
typedef struct date
{
    int year;
    int month;
    int day;
}DATE;
typedef struct stu
{
    long stuID;     //学号
    char stuname[10];    //名字
    char stusex;     //性别
    int score;    //分数
}STU;
typedef struct node
{
    STU stu;
    struct node* next;   //指向下一个节点的指针
}NODE;
NODE* head = NULL;  //定义头指针




void start();
void inputstudent(STU stu[]);
void savestudent();
void readstudent();
void printfstudent();


#define N 30
int main()
{
    STU stu[N];
    int m = 4;
    while (1)
    {
        start();
        char ch = _getch();
        switch (ch)
        {
        case '1':  //录入学生信息
            inputstudent(stu);
            break;
        case '2':  //保存学生信息
            savestudent();
            break;
        case '3'://读取学生信息
            readstudent();
            break;
        case '4':  //打印学生成绩
            printfstudent();
            break;
        case '5':  //按总分由高到低排出名次
            break;
        case '6':  //按总分由低到高排出名次
            break;
        case '7':  //按学号由小到大排出成绩表
            break;
        case '8':  //按姓名字典顺序排序排出成绩表
            break;
        }
    }
    return 0;
}


void start()
{
    printf("*****************************************\n");
    printf("欢迎使用学生成绩管理系统        *\n");
    printf("*1.录入学生信息                *\n");
    printf("*2.保存学生信息                *\n");
    printf("*3.读取学生信息                *\n");
    printf("*4.打印学生信息                *\n");
    printf("*5.按总分由高到低排出名次        *\n");
    printf("*6.按总分由低到高排出名次        *\n");
    printf("*7.按学号由小到大排出成绩表        *\n");
    printf("*8.按姓名字典顺序排序排出成绩表        *\n");
    printf("*9.根据学号查询学生成绩及排名        *\n");
    printf("*0.根据姓名查询学生成绩及排名        *\n");
    printf("*****************************************\n");
}


void inputstudent(STU stu[])
{
    NODE* newnode = (NODE*)malloc(sizeof(node)); //创建一个新结点来作头结点,使newnode这个指针可以通过->来当作结构体变量来用
    newnode->next = NULL;
    if (head == NULL)   //遍历
    {
        head = newnode;
    }
    else
    {
        newnode->next = head;
        head = newnode; //newnode = head;  修改
    }
        printf("学号:");
        scanf_s("%ld", &newnode->stu.stuID);
        printf("姓名:");
        scanf_s("%s", newnode->stu.stuname, 10); //修改
        printf("性别:");
        scanf_s(" %c", &newnode->stu.stusex, 1);  //修改
        printf("成绩:");
        scanf_s(" %d", &newnode->stu.score);
} 

void savestudent()    //保存学生信息
{
    FILE* pf = fopen("pph.txt", "w"); //创建并打开文件
    if (pf == NULL) //判断打开文件是否失败
    {
        printf("打开文件失败\n");
        return;
    }
    NODE* p = head;
    while (p != NULL)
    {
        fwrite(&p->stu, 1, sizeof(STU), pf);
        p = p->next;
    }
    fclose(pf);
    printf("数据保存成功\n");
    system("pluse"); //暂停
    system("cls");  //清屏
}


void readstudent()   //读取学生信息
{
    FILE* pf = fopen("pph.txt", "r");  //打开文件
    if (pf == NULL) //判断打开文件是否失败
    {
        printf("err!\n");
        return;
    }
    while (!feof(pf))
    {
        NODE* newnode = (NODE*)malloc(sizeof(NODE));
        fread(&newnode->stu, 1, sizeof(STU), pf);
        newnode->next = NULL;
        //头插法
        if (head == NULL)
        {
            head = newnode;
        }
        else
        {
            newnode->next = head;
            head = newnode;
        }
    }
    printf("加载数据成功\n");
    fclose(pf);
}
void printfstudent()
{
    NODE* P = head;
    while (P!=NULL)
    {
        printf("%ld %s %c %d", P->stu.stuID, P->stu.stuname, P->stu.stusex, P->stu.score);
        P = P->next;
    }
    system("pluse");
    system("cls");
}

读取完数据,打印的时候没反应,要么就是闪烁

该回答引用GPTᴼᴾᴱᴺᴬᴵ
如果读取数据后打印时没有反应或者闪烁,可能是由于以下原因之一:

  1. 数据打印速度过快:如果你的程序循环打印大量数据,可能会导致数据输出速度过快,导致终端屏幕上的数据快速闪烁。这时可以考虑使用延迟等方法来降低打印速度。

  2. 终端屏幕刷新问题:有些终端程序会在数据输出时刷新屏幕,而有些则会等到数据全部输出后再刷新。如果你的终端程序是前者,那么每次输出数据都会导致屏幕闪烁。你可以在程序开始时调整终端程序的设置,让它在数据全部输出后再刷新屏幕,从而减少闪烁。

  3. 数据输出格式问题:如果你的数据输出格式不正确,可能会导致数据无法正确显示。例如,如果你打印了一个对象而没有实现其__str__方法,那么打印的结果可能是对象的地址,而不是你期望的数据。