猫儿恋上鱼 发表于 2020-12-4 11:38:33

文件一道题求助大佬急急急

#include <stdio.h>
#include <stdlib.h>
#define COURSE_MAXNUM 5
//声明结构STUDENT
struct student
{
    long studentID;
    char studentName;
    char sex;
    struct{
      int year;
      int month;
      int day;
    }birthday;
    float score;
    float total;
    float average;
    int rank;
};
typedef struct student STUDENT;

//从文件fileName表示的二进制文件中读取学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩
//文件的第一行存储的信息包含了n和m,即学生的人数和课程门数
void ReadStudInfo(const char *fileName, STUDENT stud[])
{
/*************Begin***************/




/*************End*****************/
}

//向文件fileName表示的二进制文件中写入学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次
//文件的第一行存储的信息应该包括n和m,即学生的人数和课程门数
void SaveResult(const char *fileName, STUDENT stud[],int n,int m)
{
/*************Begin***************/




/*************End*****************/
}


1.ReadStudInfo函数功能:实现从二进制文件中读取学生的基本信息。函数ReadStudInfo函数原型为:

void ReadStudInfo(const char *fileName, STUDENT stud[]);

其中:

参数fileName是一个二进制格式的文件,位于当前目录,即与源程序文件在同一文件夹下。文件中首先是以二进制数据形式写入的学生人数(整数n,不超过30)和课程数量(整数n,不超过5),然后是n个学生的信息,学生信息在结构STUDENT中定义:

struct student
{
long studentID;
char studentName;
char sex;
struct{
      int year;
      int month;
      int day;
}birthday;
float score;
float total;
float average;
int rank;
};
typedef struct student STUDENT;

文件中存储了 total,average,rank 三项信息,但均为初始值0。
函数ReadStudInfo的第二个参数stud存放读取出来的学生信息。




而2.SaveResult函数功能:实现从二进制格式文件中读取学生的基本信息。函数SaveResult函数原型为:

void SaveResult(const char *fileName, STUDENT stud[],int n,int m);

其中:

参数fileName是一个二进制格式文件,位于当前目录,即与源程序文件在同一文件夹下。
文件中首先要求以二进制形式写入学生人数(整数n,不超过30)和课程数量(整数n,不超过5),然后是n个学生的信息。n个学生的信息存放在第二个参数stud开始的n个结构体数据单元中。
每个学生的信息包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次。






jackz007 发表于 2020-12-4 11:38:34

本帖最后由 jackz007 于 2020-12-6 13:24 编辑

      代码分为两个文件,分别对应两个程序,一个是 "save.c" 专门录入数据,另一个是 "load.c" 专门用来显示结果。两份代码除了 main() 不一样外,其它部分一模一样。

"save.c"
#include <stdio.h>
#include <stdlib.h>

#define COURSE_MAXNUM 5

//声明结构STUDENT
struct student
{
    long studentID;
    char studentName;
    char sex;
    struct{
      int year;
      int month;
      int day;
    }birthday;
    float score;
    float total;
    float average;
    int rank;
};

typedef struct student STUDENT;

void swap(int * a , int * b)
{
      int t   ;
      t = * a   ;
      * a = * b ;
      * b = t   ;
}

//从文件fileName表示的文本文件中读取学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩
//文件的第一行存储的信息包含了n和m,即学生的人数和课程门数
void ReadStudInfo(const char * fileName , STUDENT stud[])
{
/***********Begin*****************/
      FILE * fp                                                   ;
      int m , n                                                   ;
      if((fp = fopen(fileName , "rb")) != NULL) {
                fread(& m , sizeof(int) , 1 , fp)                     ;
                fread(& n , sizeof(int) , 1 , fp)                     ;
                fread(stud , sizeof(STUDENT) , m , fp)                ;
                fclose(fp)                                          ;
      } else {
                fprintf(stderr , "\n")                              ;
                fprintf(stderr , "无法打开输入文件[%s]\n" , fileName) ;
                fprintf(stderr , "\n")                              ;
      }
/***********End*******************/
}

//向文件fileName表示的文本文件中写入学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次
//文件的第一行存储的信息应该包括n和m,即学生的人数和课程门数
void SaveResult(const char *fileName, STUDENT stud[] , int n , int m)
{
/***********Begin*****************/
      FILE * fp                                                      ;
      if((fp = fopen(fileName , "wb")) != NULL) {
                fwrite(& m , sizeof(int) , 1 , fp)                     ;
                fwrite(& n , sizeof(int) , 1 , fp)                     ;
                fwrite(stud , sizeof(STUDENT) , m , fp)                ;
                fclose(fp)                                             ;
      } else {
                fprintf(stderr , "\n")                                 ;
                fprintf(stderr , "无法打开输入文件[%s]\n" , fileName);
                fprintf(stderr , "\n")                                 ;
      }      
/***********End*******************/
}

main(void)
{
      STUDENT d                              ;
      int m , n , j , k , rank                   ;
      printf("请输入人数和课程门数 : ")          ;
      scanf("%d%d" , & m , & n)                  ;
      for(k = 0 ; k < m ; k ++) {
                printf("学号: ")                   ;
                scanf("%d" , & d . studentID)   ;
                printf("姓名: ")          ;
                scanf("%s" , & d . studentName) ;
                printf("性别: ")                   ;
                scanf("%s" , & d . sex)         ;               
                printf("生日(yy mm dd): ")         ;
                scanf("%d%d%d" , & d . birthday . year , & d . birthday . month , & d . birthday . day) ;               
                printf("%d 门课程的成绩 : " , n)   ;
                for(d . total = 0 , j = 0 ; j < n ; j ++) {
                        scanf("%f" , & d . score)                                                          ;
                        d . total += d . score                                                          ;
                }
                d . average = d . total / n;
                d . rank = 0                  ;
      }
      SaveResult("student.dat" , d , n , m)      ;
}
"load.c"
#include <stdio.h>
#include <stdlib.h>

#define COURSE_MAXNUM 5

//声明结构STUDENT
struct student
{
    long studentID;
    char studentName;
    char sex;
    struct{
      int year;
      int month;
      int day;
    }birthday;
    float score;
    float total;
    float average;
    int rank;
};

typedef struct student STUDENT;

void swap(int * a , int * b)
{
      int t   ;
      t = * a   ;
      * a = * b ;
      * b = t   ;
}

//从文件fileName表示的文本文件中读取学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩
//文件的第一行存储的信息包含了n和m,即学生的人数和课程门数
void ReadStudInfo(const char * fileName , STUDENT stud[] , int * n , int * m)
{
/***********Begin*****************/
      FILE * fp                                                   ;
      if((fp = fopen(fileName , "rb")) != NULL) {
                fread(m , sizeof(int) , 1 , fp)                     ;
                fread(n , sizeof(int) , 1 , fp)                     ;
                fread(stud , sizeof(STUDENT) , * m , fp)            ;
                fclose(fp)                                          ;
      } else {
                fprintf(stderr , "\n")                              ;
                fprintf(stderr , "无法打开输入文件[%s]\n" , fileName) ;
                fprintf(stderr , "\n")                              ;
      }
/***********End*******************/
}

//向文件fileName表示的文本文件中写入学生基本信息,
//包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次
//文件的第一行存储的信息应该包括n和m,即学生的人数和课程门数
void SaveResult(const char *fileName, STUDENT stud[] , int n , int m)
{
/***********Begin*****************/
      FILE * fp                                                      ;
      if((fp = fopen(fileName , "wb")) != NULL) {
                fwrite(& m , sizeof(int) , 1 , fp)                     ;
                fwrite(& n , sizeof(int) , 1 , fp)                     ;
                fwrite(stud , sizeof(STUDENT) , m , fp)                ;
                fclose(fp)                                             ;
      } else {
                fprintf(stderr , "\n")                                 ;
                fprintf(stderr , "无法打开输入文件[%s]\n" , fileName);
                fprintf(stderr , "\n")                                 ;
      }      
/***********End*******************/
}

main(void)
{
      STUDENT d                               ;
      int i , j , k , m , n , e               ;
      ReadStudInfo("student.dat" , d , & n , & m) ;
      for(k = 0 ; k < m ; k ++) e = k          ;
      for(i = 0 ; i < m - 1 ; i ++) {
                for(j = i + 1 ; j < m ; j ++) {
                        if(d] . total < d] . total) swap(& e , & e) ;
                }
      }               
      for(k = 0 ; k < m ; k ++) d] . rank = k + 1                            ;
      for(k = 0 ; k < m ; k ++) {
                printf("%d" , d] . studentID)   ;
                printf(" %s" , d] . studentName);
                printf(" %s" , d] . sex)          ;
                printf(" %4d-%02d-%02d" , d] . birthday . year , d] . birthday . month , d] . birthday . day) ;
                printf(" %.0f" , d] . score)                                                                         ;
                for(j = 1 ; j < n ; j ++) printf(" %.0f" , d] . score)                                             ;
                printf(" %.0f %.0f %d\n" , d] . total , d] . average , d] . rank)                           ;
      }         
}
      注意,题目中 ReadStudInfo() 的定义存在严重缺陷:
void ReadStudInfo(const char * fileName , STUDENT stud[])
      因为学生人数和功课门数只能通过读文件内容才能获取,如果没有这两项关键数据,读出来的文件内容也无法处理,在函数定义中,并没有为传递这两项参数提供通道。所以,我把这个函数的定义修改成了:
void ReadStudInfo(const char * fileName , STUDENT stud[] , int * n , int * m)
      这里要强调的是,这个修改是必须的!
      编译、运行实况
I:\00.2020\.Exercise\00.C\链表文件>g++ -o load load.c

I:\00.2020\.Exercise\00.C\链表文件>load
20183004 任盈盈 女 2000-03-25 78 95 87 90 350 88 1
20183005 王仪琳 女 1999-08-01 92 83 72 92 339 85 2
20183002 林平之 男 2000-10-25 78 92 88 78 336 84 3
20183001 令狐冲 男 1999-09-01 90 83 72 82 327 82 4
20183003 岳灵珊 女 2001-12-01 89 72 98 66 325 81 5

I:\00.2020\.Exercise\00.C\链表文件>

猫儿恋上鱼 发表于 2020-12-8 16:46:34

jackz007 发表于 2020-12-6 11:20
代码分为两个文件,分别对应两个程序,一个是 "save.c" 专门录入数据,另一个是 "load.c" 专门用来 ...

哦哦好的大佬已经解决了谢谢啦
页: [1]
查看完整版本: 文件一道题求助大佬急急急