1)有5个学生,每个学生有3门课成绩,输入学生数据(学号,姓名,3门课程成绩)。计算出平均成绩,并按平均成绩排序,排序后的数据(包括平均成绩)存入文件student.dat中。然后从文件中读取数据并输出。
要求:分别用fprintf/fscanf及fwrite/fread函数实现文件数据读写。
注意fwrite/fread是以二进制形式操作的,因此直接用文本编辑器打开fwrite产生的文件可能会出现乱码
fprintf/fscanf
#include<stdio.h>
#define N 3
struct student
{
char sNo[12];
char sName[20];
float scores[3];
double average;
};
int main()
{
int i,j,idx;
struct student stu[N],stu2[N];
struct student temp;
printf("Please enter No,Name,3 scores:");
//输入并计算平均值
for(i=0;i<N;i++)
{
scanf("%s %s %f %f %f",&stu[i].sNo,&stu[i].sName,&stu[i].scores[0],&stu[i].scores[1],&stu[i].scores[2]);
stu[i].average=(stu[i].scores[0]+stu[i].scores[1]+stu[i].scores[2])/3.0;
}
//排序
for(i=0;i<N;i++)
{
for(j=i;j<N;j++)
{
idx=j;
if(stu[j].average>stu[idx].average)idx=j;
}
temp=stu[idx];
stu[idx]=stu[i];
stu[i]=temp;
}
//打开文件
FILE *fp;
if(NULL==(fp=fopen("student.txt","w+")))
{
printf("Error open!");
exit(0);
}
//存入数据
for(i=0;i<N;i++)
{
fprintf(fp,"%s %s %f %f %f %lf\n",stu[i].sNo,stu[i].sName,stu[i].scores[0],stu[i].scores[1],stu[i].scores[2],stu[i].average);
}
//读取数据
rewind(fp);
for(i=0;i<N;i++)
{
fscanf(fp,"%s %s %f %f %f %lf",stu2[i].sNo,stu2[i].sName,&stu2[i].scores[0],&stu2[i].scores[1],&stu2[i].scores[2],&stu2[i].average);
}
//输出数据
for(i=0;i<N;i++)
{
printf("%s %s %f %f %f %lf\n",stu2[i].sNo,stu2[i].sName,stu2[i].scores[0],stu2[i].scores[1],stu2[i].scores[2],stu2[i].average);
}
return 0;
}
fwrite/fread
#include<stdio.h>
#define N 3
struct student
{
char sNo[12];
char sName[20];
float scores[3];
double average;
}stu[N];
int main()
{
struct student stu[N],stu2[N];
struct student temp;
struct student *pa=stu,*pb=stu2,*max;
printf("Please enter No,Name,3 scores:");
//输入并计算平均值
for(;pa<stu+N;pa++)
{
scanf("%s %s %f %f %f",pa->sNo,pa->sName,&pa->scores[0],&pa->scores[1],&pa->scores[2]);
pa->average=(pa->scores[0]+pa->scores[1]+pa->scores[2])/3.0;
}
//排序
for(pa=stu;pa<stu+N;pa++)
{
for(pb=pa;pb<stu+N;pb++)
{
max=pb;
if(pb->average>max->average)max=pb;
}
temp=*max;
*max=*pa;
*pa=temp;
}
//打开文件
FILE *fp;
if(NULL==(fp=fopen("student.txt","w+")))
{
printf("Error open!");
exit(0);
}
//存入数据
pa=stu;
fwrite(pa,sizeof(struct student),N,fp);
//读取数据
rewind(fp);
pb=stu2;
fread(pb,sizeof(struct student),N,fp);
//输出数据
for(pb=stu2;pb<stu2+N;pb++)
{
printf("%s %s %f %f %f %lf\n",pb->sNo,pb->sName,pb->scores[0],pb->scores[1],pb->scores[2],pb->average);
}
return 0;
}