库里斯托 2023-02-28 09:34 采纳率: 91.1%
浏览 39
已结题

关于文件打印的问题,如何解决?

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include <string.h>
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;  //定义头指针

NODE* creatlist();

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


#define N 30
int main()
{
    NODE* list = creatlist();
    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");
}

NODE* creatlist()    //创建表头表示整个链表即创建链表(表头可以是头结点,也可以是数据结点,通常是头结点)
{
    NODE* headNode = (NODE*)malloc(sizeof(NODE));
    headNode->next = NULL;
    return headNode;
}


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


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

img

读取完数据后,打印的前面有有一段乱码,后面的123 张三 m 99才是我录入的内容,如何解决?

  • 写回答

3条回答 默认 最新

  • 伍六七0804 2023-02-28 10:09
    关注

    你插入的时候把头指针移动了,不能移动head,head永远要指向头部

    
    void inputstudent(STU stu[])
    {
        NODE* newnode = (NODE*)malloc(sizeof(NODE)); //创建一个新结点来作头结点,使newnode这个指针可以通过->来当作结构体变量来用
        newnode->next = NULL;
        NODE* mov = head;
        if (head == NULL)   //遍历
        {
            head = newnode;
        }
        else
        {
            while(mov->next != NULL)
            {
                mov = mov->next;
            }
            mov->next = newnode;
            
        }
            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);
    } 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月11日
  • 已采纳回答 3月3日
  • 创建了问题 2月28日

悬赏问题

  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统