Cc-282 2023-06-29 04:32 采纳率: 40%
浏览 19
已结题

C语言问题:有关文件读写与单链表

文件读写时想实现的是“学号 姓名 成绩一 成绩二 成绩三 总分”这样的形式,而程序运行后文件里和运行显示的样子同下图一样,会出现两个名字,不知道为什么会出现这种情况,帮解决一下,谢谢

img

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//学生结构体 
typedef struct Student{
    char sno[8];    //8位学号 
    char name[20];  //姓名 
    float Score[3];    //以此表示数学成绩、英语成绩、C语言成绩
    float total;         //总分 
}STU;

//学生结点 
typedef struct node{
    STU data;   //学生数据 
    struct node* next;
}Node;

//链表 
typedef struct list{
    Node* head;   //头指针 
}List;
//初始化
void InitList(List* ls){
    ls->head=NULL;
    //以读的方式打开文件,要求文件必须存在 
    FILE* file=fopen("C:\\Users\\admin\\Desktop\\students'score.txt","rb");
    if(file==NULL)
    {
        printf("文件打开失败!!\n");
        return; 
    }
    STU stu;
    while(!feof(file)){
        fscanf(file,"%s %s %f %f %f %f",&stu.sno,&stu.name,&stu.Score[0],&stu.Score[1],&stu.Score[2],&stu.total);
        if(feof(file))
           break;
        Add(ls,stu);
    }
    fclose(file);   //关闭文件 
    printf("初始化成功!"); 
} 

void main(){
    List ls;
    InitList(&ls);
    STU stu; 
    int choice = 0,i;
    char sno[8];
    Menu();
    scanf("%d",&choice);
    while(choice!=0){
        switch(choice){
            case 1:
                Display(&ls);
                break;
            case 2:
                printf("请输入要查询的学号:");
                scanf("%s",sno);
                Inquire(&ls,sno);
                break;
            case 3:
                printf("请输入学号:");
                scanf("%s",stu.sno);
                printf("请输入姓名:");
                scanf("%s",stu.name);
                printf("请输入三科成绩:\n");
                for(i=0; i<3; i++){
                    printf("请输入第%d科成绩:",i+1);
                    scanf("%f",&stu.Score[i]);
                }
                stu.total=stu.Score[0]+stu.Score[1]+stu.Score[2];
                Add(&ls,stu);
                printf("学生信息添加成功。\n");
                Save(&ls); 
                break;
            case 4:
                printf("请输入要删除学生信息的学号:");
                scanf("%s",sno);
                Delete(&ls,sno);
                printf("删除成功!\n");
                Save(&ls);
                break;
            case 5:
                printf("请输入要修改某个学生成绩的学号:");
                scanf("%s",sno);
                Modify(&ls,sno);
                Save(&ls); 
                break;
            case 6:
                Statistics(&ls);
                break;
            default:
            printf("输入有误请重新输入!!!\n");
            break;     
        }
        Menu();
        scanf("%d",&choice);
    }
}

//菜单 
void Menu(){
    printf("\n\n"); 
    printf("------------------学生成绩管理系统------------------\n");
    printf("   1.显示学生成绩;\n");
    printf("   2.查询学生成绩;\n");
    printf("   3.添加学生成绩;\n");
    printf("   4.删除学生成绩;\n");
    printf("   5.修改学生成绩;\n");
    printf("   6.统计学生成绩;\n");
    printf("   0.退出程序\n");
    printf("----------------------------------------------------\n");
    printf("请选择要完成的操作:"); 
}

//显示
void Display(List* ls){
    Node* p=ls->head;
    if(p==NULL){
        printf("学生信息为空!!!\n");
        return;
    }
    printf("学号       姓名       数学       英语       C语言       总分\n");
    while(p!=NULL){
        printf("%s %s %.2f  %.2f  %.2f   %.2f\n",p->data.sno,p->data.name,p->data.Score[0],p->data.Score[1],p->data.Score[2],p->data.total);
        p=p->next;
    }
}

  • 写回答

2条回答 默认 最新

  • 创意程序员 2023-06-29 07:27
    关注

    char sno[8] 长度扩大,比实际值多1,用于存放'\0'结束符。否则程序认为字符串没结束,继续往后读到了后面的姓名。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月29日
  • 创建了问题 6月29日