按格式读写文件存取学生信息

任务描述

本关要求编写函数ReadStudInfoSaveResult

相关知识(略)
编程要求

本关的编程任务是补全step2/fileTxt.c文件中ReadStudInfo函数和SaveResult函数,以实现按格式使用FILE结构存取学生信息的功能。具体要求如下: 1.ReadStudInfo函数功能:实现从文本文件中读取学生的基本信息。函数ReadStudInfo函数原型为:

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

其中:

  • 参数fileName是一个文本文件,位于当前目录,即与源程序文件在同一文件夹下。文件中首先是以字符形式写入的学生人数(整数n,不超过30)和课程数量(整数n,不超过5),然后是n个学生的信息,学生信息在结构STUDENT中定义:
     
      
    1. struct student
    2. {
    3. long studentID;
    4. char studentName[20];
    5. char sex[4];
    6. struct{
    7. int year;
    8. int month;
    9. int day;
    10. }birthday;
    11. float score[COURSE_MAXNUM];
    12. float total;
    13. float average;
    14. int rank;
    15. };
    16. typedef struct student STUDENT;
  • 文件中没有存储 total,average,rank 三项信息。
  • 函数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个结构体数据单元中。
  • 每个学生的信息包括学号、姓名、性别、出生日期,若干门课程的成绩、总分、平均分、名次。
测试说明

本关的测试文件是step2/main.c,其中将会调用你在step2/fileTxt.c文件中完成的ReadStudInfo函数和SaveResult函数。除此之后,step2/main.c中还对学生信息进行了处理:包括计算总分、平均分和名次。其次还实现了输入测试数据、输出测试结果、写入测试文件(student.txt)、读取测试文件(result.txt):

1.调用函数Input()将标准输入的数据读入内存,然后调用SaveStudInfo()函数将数据再写入到student.txt文本文件,以便为**ReadStudInfo()**函数从文本文件读取学生信息准备测试数据。

2.调用函数ReadResult()SaveResult()函数保存的result.txt中的学生信息读入内存,并调用Print()函数进行输出。**SaveResult()**函数需要将计算出总分、平均分和名次信息的学生信息存入result.txt

3.student.txt的示例如下:

4.result.txt的示例如下:

5.step2/main.c主要代码如下:

 
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define COURSE_MAXNUM 5
  4. //声明结构STUDENT
  5. struct student
  6. {
  7. long studentID;
  8. char studentName[20];
  9. char sex[4];
  10. struct{
  11. int year;
  12. int month;
  13. int day;
  14. }birthday;
  15. float score[COURSE_MAXNUM];
  16. float total;
  17. float average;
  18. int rank;
  19. };
  20. typedef struct student STUDENT;
  21. //声明外部函数,函数在其它源文件中实现
  22. extern void ReadStudInfo(const char *fileName, STUDENT stud[]);
  23. extern void SaveResult(const char *fileName, STUDENT stud[],int n,int m);
  24. //声明本文件中的其它函数
  25. void Input(STUDENT *stud, int n,int m);
  26. void Print(STUDENT *stud, int n,int m);
  27. void TotalAndAverage(STUDENT *stud, int n,int m);
  28. void RankByTotal(STUDENT *stud, int n,int m);
  29. void SaveStudInfo(const char *fileName,STUDENT *stud,int n,int m);
  30. void ReadResult(const char *fileName,STUDENT *stud);
  31. int main()
  32. {
  33. int n,m; //n用于存放学生人数,m用于存放课程门数。
  34. STUDENT *stud; //指向存放学生信息的存储块的首地址
  35. scanf("%d%d",&n,&m); //输入学生总人数
  36. // 动态分配存储
  37. stud = (STUDENT *)malloc(n*sizeof(STUDENT));
  38. Input(stud,n,m);//输入学生信息
  39. //将测试输入信息写入文件
  40. SaveStudInfo("student.txt",stud,n,m);
  41. free(stud);
  42. //打开文件student.txt,以文本文件方式打开用于读
  43. //从文件中读取学生信息到数组stud中
  44. stud = (STUDENT *)malloc(n*sizeof(STUDENT));
  45. ReadStudInfo("student.txt",stud);
  46. // 计算总分
  47. TotalAndAverage(stud,n,m);
  48. // 计算排名
  49. RankByTotal(stud,n,m);
  50. //打开文件result.txt,以文本文件方式打开用于写
  51. //将计算出了总分和平均分以及名次的学生信息写入文件
  52. SaveResult("result.txt",stud,n,m);
  53. free(stud);
  54. //打开文件result.txt,以文本文件方式打开用于读
  55. //从文件中读取学生信息到数组stud中,用于测试是否与预期输出一致
  56. stud = (STUDENT *)malloc(n*sizeof(STUDENT));
  57. ReadResult("result.txt",stud);
  58. //输出学生信息
  59. Print(stud,n,m);
  60. free(stud);
  61. return 0;
  62. }

平台会对你编写的代码进行测试: 测试样例:

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用以下步骤实现文件学生信息读写排序: 1. 定义一个结构体来存储学生信息,包括学号、姓名、年龄、性别、成绩等字段。 2. 定义一个函数读取学生信息文件,并将读取的信息存储到结构体数组。 3. 定义一个函数来对学生信息进行排序,可以使用快速排序等算法来实现。 4. 定义一个函数来将排序后的学生信息写入文件。 下面是一个示例代码,可以根据需要进行修改: ```c++ #include <iostream> #include <fstream> #include <string> #include <algorithm> using namespace std; struct Student { string id; string name; int age; string gender; double score; }; bool cmp(Student a, Student b) { return a.score > b.score; // 按成绩降序排序 } void readData(Student students[], int &n) { ifstream fin("data.txt"); if (!fin) { cout << "文件打开失败!" << endl; return; } n = 0; while (!fin.eof()) { fin >> students[n].id >> students[n].name >> students[n].age >> students[n].gender >> students[n].score; n++; } fin.close(); } void writeData(Student students[], int n) { ofstream fout("sorted_data.txt"); if (!fout) { cout << "文件打开失败!" << endl; return; } for (int i = 0; i < n; i++) { fout << students[i].id << " " << students[i].name << " " << students[i].age << " " << students[i].gender << " " << students[i].score << endl; } fout.close(); } int main() { const int MAX_N = 1000; Student students[MAX_N]; int n = 0; readData(students, n); sort(students, students + n, cmp); writeData(students, n); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卑微的Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值