为什么读取信息只能读取一个


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Student
{
    char name[20];//姓名
    int age;//年龄
    int stuNum;//学号
    int score;//成绩
}Student;//定义学生
typedef struct _Node//节点
{
    Student stu;
    struct _Node* pNext; //指向下一个节点的指针
}Node;
Node *g_pHead=NULL;
void Welcome()//目录
{
    printf("**************************************************\n");
    printf("*\t欢迎使用高校学生成绩管理系统\t\t*\n");
    printf("**************************************************\n");
    printf("*\t\t请选择功能列表\t\t\t*\n");
    printf("**************************************************\n");
    printf("*\t\t1.录入学生信息\t\t\t*\n");
    printf("*\t\t2.打印学生信息\t\t\t*\n");
    printf("*\t\t3.保存学生信息\t\t\t*\n");
    printf("*\t\t4.读取学生信息\t\t\t*\n");
    printf("*\t\t5.统计所有学生人数\t\t*\n");
    printf("*\t\t6.查找学生信息\t\t\t*\n");
    printf("*\t\t7.修改学生信息\t\t\t*\n");
    printf("*\t\t8.删除学生信息\t\t\t*\n");
    printf("*\t\t0.退出系统\t\t\t*\n");
    printf("**************************************************\n");
}
void InputStudent()//录入学生信息
{
    //创建一个新节点
    Node* pNewNode=(Node*)malloc(sizeof(Node));
    pNewNode->pNext=NULL;
    //头插法
    if(g_pHead==NULL)
    {
        g_pHead=pNewNode;
    }
    else
    {
        pNewNode->pNext=g_pHead;
        g_pHead=pNewNode;
    }
    printf("请输入学生姓名:\n");
    scanf("%s",pNewNode->stu.name);//从键盘格式化接受一个字符串
    printf("请输入学生的年龄:\n");
    scanf("%d",&pNewNode->stu.age);
    printf("请输入学生的学号:\n");
    scanf("%d",&pNewNode->stu.stuNum);
    printf("请输入学生的成绩:\n");
    scanf("%d",&pNewNode->stu.score);
    printf("学生信息录入成功:\n");
    system("pause");//暂停
    system("cls");//清屏
}
void PrintfStudent()//打印学生信息
{
    printf("**************************************************\n");
    printf("*\t欢迎使用高校学生成绩管理系统\t\t*\n");
    printf("**************************************************\n");
    printf("*\t学号\t*\t姓名\t*\t年龄\t*\t成绩*\n");
    printf("**************************************************\n");
    //遍历链表
    Node* p=g_pHead;
    while(p!=NULL)
    {
        printf("*\t%d\t*\t%s\t*\t%d\t*\t%d*\n",p->stu.stuNum,p->stu.name,p->stu.age,p->stu.score);
        p=p->pNext;
    }
    system("pause");//暂停
    system("cls");//清屏
}
void SaveStudent()//保存学生信息
{
    //打开文件
    FILE* fp=fopen("E:\\课程设计\\studnet","w");
    if(fp==NULL)
    {
        printf("打开文件失败\n");
        return;
    }
    //遍历链表
    Node* p=g_pHead;
    while(p!=NULL)
    {
        fwrite(&p->stu,1,sizeof(Student),fp);
        p=p->pNext;
    }
    //关闭文件
    fclose(fp);
    printf("\n数据保存成功\n");
    system("pause");//暂停
    system("cls");//清屏
}
void ReadStudent()//读取学生信息
{
    //打开文件
    FILE *fp=fopen("E:\\课程设计\\studnet","r");
    if(fp==NULL)
    {
        printf("打开文件失败\n");
        return;
    }
    //读文件
    Student stu;
    while(fread(&stu,1,sizeof(Student),fp))
    {
        //创建一个新节点
        Node* pNewNode=(Node*)malloc(sizeof(Node));
        pNewNode->pNext=NULL;
        memcpy(pNewNode,&stu,sizeof(Student));
        //头插法
       if(g_pHead==NULL)
       {
           g_pHead=pNewNode;
       }
       else
       {
           pNewNode->pNext=g_pHead;
           g_pHead=pNewNode;
       }
       //关闭文件
       fclose(fp);
       printf("加载数据成功\n");
    }
    system("pause");//暂停
    system("cls");//清屏

}
int CountStudent()//统计所有学生人数
{
    int nCount=0;
    //遍历链表
    Node* p=g_pHead;
    while(p!=NULL)
    {
        nCount++;
        p=p->pNext;
    }
    return nCount;
}
int main()
{
    while(1)
    {
        int nCount=0;
        Welcome();//目录
        char ch=getch();//从键盘接受一个字符
        switch(ch)
        {
         case '1'://录入学生信息
            InputStudent();
            break;
         case '2'://打印学生信息
            PrintfStudent();
            break;
         case '3'://保存学生信息
             SaveStudent();
            break;
         case '4'://读取学生信息
            ReadStudent();
            break;
         case '5'://统计所有学生人数
            printf("学生总人数为:%d\n",CountStudent());
            system("pause");//暂停
            system("cls");//清屏
            break;
         case '6'://查找学生信息
            break;
         case '7'://修改学生信息
            break;
         case '8'://删除学生信息
            break;
         case '0'://退出系统
            break;
        }
    }
    return 0;
}

  您的打印函数没像读取函数一样循环读取学生信息啊,您就打印了读取函数的最后一个。您应该像读取函数一样读取打印才好。


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

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Student
{
    char name[20];//姓名
    int age;//年龄
    int stuNum;//学号
    int score;//成绩
}Student;//定义学生
typedef struct _Node//节点
{
    Student stu;
    struct _Node* pNext; //指向下一个节点的指针
}Node;
Node* g_pHead = NULL;
void Welcome()//目录
{
    printf("**************************************************\n");
    printf("*\t欢迎使用高校学生成绩管理系统\t\t*\n");
    printf("**************************************************\n");
    printf("*\t\t请选择功能列表\t\t\t*\n");
    printf("**************************************************\n");
    printf("*\t\t1.录入学生信息\t\t\t*\n");
    printf("*\t\t2.打印学生信息\t\t\t*\n");
    printf("*\t\t3.保存学生信息\t\t\t*\n");
    printf("*\t\t4.读取学生信息\t\t\t*\n");
    printf("*\t\t5.统计所有学生人数\t\t*\n");
    printf("*\t\t6.查找学生信息\t\t\t*\n");
    printf("*\t\t7.修改学生信息\t\t\t*\n");
    printf("*\t\t8.删除学生信息\t\t\t*\n");
    printf("*\t\t0.退出系统\t\t\t*\n");
    printf("**************************************************\n");
}
void InputStudent()//录入学生信息
{
    //创建一个新节点
    Node* pNewNode = (Node*)malloc(sizeof(Node));
    pNewNode->pNext = NULL;
    //头插法
    if (g_pHead == NULL)
    {
        g_pHead = pNewNode;
    }
    else
    {
        pNewNode->pNext = g_pHead;
        g_pHead = pNewNode;
    }
    printf("请输入学生姓名:\n");
    scanf("%s", pNewNode->stu.name);//从键盘格式化接受一个字符串
    printf("请输入学生的年龄:\n");
    scanf("%d", &pNewNode->stu.age);
    printf("请输入学生的学号:\n");
    scanf("%d", &pNewNode->stu.stuNum);
    printf("请输入学生的成绩:\n");
    scanf("%d", &pNewNode->stu.score);
    printf("学生信息录入成功:\n");
    system("pause");//暂停
    system("cls");//清屏
}
void PrintfStudent()//打印学生信息
{
    printf("**************************************************\n");
    printf("*\t欢迎使用高校学生成绩管理系统\t\t*\n");
    printf("**************************************************\n");
    printf("*\t学号\t*\t姓名\t*\t年龄\t*\t成绩*\n");
    printf("**************************************************\n");
    //遍历链表
    Node* p = g_pHead;
    while (p != NULL)
    {
        printf("*\t%d\t*\t%s\t*\t%d\t*\t%d*\n", p->stu.stuNum, p->stu.name, p->stu.age, p->stu.score);
        p = p->pNext;
    }
    system("pause");//暂停
    system("cls");//清屏
}
void SaveStudent()//保存学生信息
{
    //打开文件
    FILE* fp = fopen("D:\\课程设计\\studnet.txt", "w"); //"E:\\课程设计\\studnet", "w"  修改
    if (fp == NULL)
    {
        printf("打开文件失败\n");
        return;
    }
    //遍历链表
    Node* p = g_pHead;
    while (p != NULL)
    {
        fwrite(&p->stu, sizeof(Student), 1, fp);//fwrite(&p->stu, 1, sizeof(Student), fp); 修改
        p = p->pNext;
    }
    //关闭文件
    fclose(fp);
    printf("\n数据保存成功\n");
    system("pause");//暂停
    system("cls");//清屏
}
void ReadStudent()//读取学生信息
{
    //打开文件
    FILE* fp = fopen("D:\\课程设计\\studnet.txt", "r");  //"E:\\课程设计\\studnet", "r"  修改
    if (fp == NULL)
    {
        printf("打开文件失败\n");
        return;
    }
    //读文件
    Student stu;
    while (fread(&stu, sizeof(Student), 1, fp) == 1) //fread(&stu, 1, sizeof(Student), fp) 修改
    {
        //创建一个新节点
        Node* pNewNode = (Node*)malloc(sizeof(Node));
        pNewNode->pNext = NULL;
        memcpy(&pNewNode->stu, &stu, sizeof(Student)); //memcpy(pNewNode, &stu, sizeof(Student)); 修改
        //头插法
        if (g_pHead == NULL)
        {
            g_pHead = pNewNode;
        }
        else
        {
            pNewNode->pNext = g_pHead;
            g_pHead = pNewNode;
        }
    } //修改
    //关闭文件
    fclose(fp);
    printf("加载数据成功\n");    
    system("pause");//暂停
    system("cls");//清屏
}
int CountStudent()//统计所有学生人数
{
    int nCount = 0;
    //遍历链表
    Node* p = g_pHead;
    while (p != NULL)
    {
        nCount++;
        p = p->pNext;
    }
    return nCount;
}
int main()
{
    while (1)
    {
        int nCount = 0;
        Welcome();//目录
        char ch = getch();//从键盘接受一个字符
        switch (ch)
        {
        case '1'://录入学生信息
            InputStudent();
            break;
        case '2'://打印学生信息
            PrintfStudent();
            break;
        case '3'://保存学生信息
            SaveStudent();
            break;
        case '4'://读取学生信息
            ReadStudent();
            break;
        case '5'://统计所有学生人数
            printf("学生总人数为:%d\n", CountStudent());
            system("pause");//暂停
            system("cls");//清屏
            break;
        case '6'://查找学生信息
            break;
        case '7'://修改学生信息
            break;
        case '8'://删除学生信息
            break;
        case '0'://退出系统
            break;
        }
    }
    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7576737
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:关于多线程与信号使用锁的问题
  • 除此之外, 这篇博客: 职工信息管理系统中的 链表初始化 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    职工信息的存储采用的数据结构是单链表,使用结构体存储职工信息,用next 指针串联多个职工信息

    在这里插入代码片
    staff *head;
    //首先链表初始化,定义头指针,指向NULL;
    void initLinkedList(){
    	head=(staff *) malloc(sizeof(staff));
    	head->next=NULL;
    }
    
  • 您还可以看一下 杨春鹏老师的微信小程序全集课程中的 店铺列表小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    在读取信息时只能读取一个信息,无法同时读取多个信息的原因是因为在读取信息时,程序是按照顺序一个一个地读取信息的,每次只能读取一个信息并处理后才能读取下一个信息。

    解决方案: 1. 使用多线程同时读取多个信息:可以创建多个线程,在每个线程中读取不同的信息,然后进行处理。这样可以实现同时读取多个信息的功能。以下是一个使用多线程的示例代码:

    import threading
    
    def read_info(info):
        # 读取信息逻辑
        pass
    
    # 创建线程
    threads = []
    infos = ["info1", "info2", "info3"] # 假设有三个信息需要读取
    for info in infos:
        thread = threading.Thread(target=read_info, args=(info,))
        thread.start()
        threads.append(thread)
    
    # 等待所有线程执行完毕
    for thread in threads:
        thread.join()
    
    1. 使用异步IO进行多个信息的并行读取:可以使用异步IO的方式,同时读取多个信息并进行处理。以下是一个使用异步IO的示例代码:
    import asyncio
    
    async def read_info(info):
        # 读取信息逻辑
        pass
    
    # 创建事件循环
    loop = asyncio.get_event_loop()
    
    # 创建任务列表
    tasks = []
    infos = ["info1", "info2", "info3"] # 假设有三个信息需要读取
    for info in infos:
        task = asyncio.ensure_future(read_info(info))
        tasks.append(task)
    
    # 并行执行任务
    loop.run_until_complete(asyncio.wait(tasks))
    
    # 关闭事件循环
    loop.close()
    

    以上是两种解决方案的示例代码,具体的实现方式可以根据实际情况进行调整和修改。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^