文件读写:创建文件,对文件进行打开、关闭、读写等基本操作。
题目描述:
1、有n个学生,每个学生有3门课程的成绩,从键盘输入n个学生的学号、姓名、成绩等数据,并保存在“stu”文件中。
2、从文件中读入学生数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均成绩存放在磁盘文件“stu”中。
3、能在屏幕上输出文件中所有数据。
算法描述:本题运用模块化设计来实现功能。首先定义一个结构体用来存储学生信息,然后就是定义的各个函数的声明。通过主函数定义一个结构数组以及调用各个函数。然后是从键盘分别输入n个学生的学号、姓名以及m门课程的成绩到结构体数组stu中,定义一的函数实现对每个学生三科分数求均分的功能。接着就是输出n个学生的学号、姓名以及m门课程的成绩到文件student.txt中。首先以写的形式打开文件,设置完全缓存模式,然后将数据写入文件,最后关闭文件。然后从文件中读取学生的学号、姓名及成绩到结构体数组stu中并返回学生数。最后输出n个学生的学号、姓名、性别、出生日期、m门课程的成绩及平均分到屏幕上。
//创建文件,对文件进行打开、关闭、读写等基本操作
#include <stdio.h>
#include <stdlib.h>
#define N 30
typedef struct //引用typedef语句,这样在定义STUDENT类型语句时就可以不包含关键字struct
{
long studentID; //学号
char studentName[10]; //姓名
int score[3]; //3门课程的成绩
float aver; //3门课程的平均分
}STUDENT;
//函数声明
void InputScore(STUDENT stu[], int n, int m);//输入学生信息
void AverScore(STUDENT stu[], int n, int m); //求出学生平均分
void WritetoFile(STUDENT stu[], int n); //将学生信息写入文件
int ReadfromFile(STUDENT stu[]); //从文件读取学生信息
void PrintScore(STUDENT stu[], int n, int m);//输出学生信息
int main(void)
{
STUDENT stu[N]; //最多的学生人数
int n, m = 3; //n为学生人数;m为三门科目成绩
printf("How many student?");
scanf("%d", &n);
InputScore(stu, n, m);
AverScore(stu, n, m);
WritetoFile(stu, n);
n = ReadfromFile(stu);
char *filename = "student.txt";
remove(filename);
PrintScore(stu, n, m);
return 0;
}
//从键盘输入n个学生的学号、姓名以及m门课程的成绩到结构体数组stu中
void InputScore(STUDENT stu[], int n, int m)
{
int i, j;
for (i=0; i<n; i++)
{
printf("Input record %d:\n", i+1);
scanf("%ld", &stu[i].studentID);
scanf("%s", stu[i].studentName);
for (j=0; j<m; j++)
{
scanf("%d", &stu[i].score[j]);
}
}
}
//计算n个学生的m门课程的平均分,存入数组aver中
void AverScore(STUDENT stu[], int n, int m)
{
int i, j, sum[N];
for (i=0; i<n; i++)
{
sum[i] = 0;
for (j=0; j<m; j++)
{
sum[i] = sum[i] + stu[i].score[j];
}
stu[i].aver = (float)sum[i]/m;
}
}
//输出n个学生的学号、姓名以及m门课程的成绩到文件student.txt中
void WritetoFile(STUDENT stu[], int n)
{
FILE *fp;
if ((fp = fopen("student.txt","w")) == NULL) //以写方式打开文本文件
{
printf("Failure to open student.txt!\n");
exit(0);
}
setvbuf(fp,NULL,_IOFBF,BUFSIZ); //设置完全缓存模式
fwrite(stu, sizeof(STUDENT), n, fp); //按数据块写文件
fclose(fp);
}
//从文件中读取学生的学号、姓名及成绩到结构体数组stu中并返回学生数
int ReadfromFile(STUDENT stu[])
{
FILE *fp;
int i;
if ((fp = fopen("student.txt","r")) == NULL) //以读方式打开文本文件
{
printf("Failure to open student.txt!\n");
exit(0);
}
setvbuf(fp,NULL,_IOFBF,BUFSIZ); //设置完全缓存模式
for (i=0; !feof(fp); i++)
{
fread(&stu[i], sizeof(STUDENT), 1, fp); //按数据块读文件
}
fclose(fp);
printf("Total students is %d.\n", i-1); //返回文件中的学生记录数
return i-1; //返回文件中的学生记录数
}
//输出n个学生的学号、姓名、性别、出生日期、m门课程的成绩及平均分到屏幕上
void PrintScore(STUDENT stu[], int n, int m)
{
int i, j;
for (i=0; i<n; i++)
{
printf("%10ld%8s",stu[i].studentID, stu[i].studentName);
for (j=0; j<m; j++)
{
printf("%4d", stu[i].score[j]);
}
printf("%6.1f\n", stu[i].aver); //字段宽度为6;保留小数点后1位
}
}