函数fread()和函数fwrite()用于一次读取一组数据,即按数据块读写文件。fread()的函数原型为:
unsigned int fread(void *buffer ,unsigned int size,unsigned int count ,FILE *fp);
fread()的功能是从fp所指的文件中读取数据块并存储到buffer指向的内存中。buffer是待读入数据块的起始地址。size是每个数据块的大小(待读入的每个数据块的字节数)。count是最多允许读取的数据块个数(每个数据块size个字节)。函数返回的是实际读到的数据块个数。
fwrite()的函数原型为:
unsigned int fwrite(void *buffer,unsigned int size,unsigned int count,FILE *fp);
fwrite()的功能是将buffer指向的内存中的数据块写入fp所指的文件。buffer是待输出数据块的起始地址。size是是每个数据块的大小(待输出的每个数据块的字节数)。count是最多允许写入的数据块个数(每个数据块size个字节)。函数返回的是实际写入的数据块个数。
快数据的读写使我们不再局限于一次只读取一个字符、一个单词或一行字符串,它允许用户指定想要读写的内存块大小,最小为1个字节,最大为整个文件。
例题:编程计算每个学生的4门课程的平均分,将学生的各科成绩及平均分输出到文件student.txt中,然后再从文件中读出数据并显示到屏幕上。
#include <stdio.h>
#include <stdlib.h>
#define N 30
typedef struct date
{
int year;
int month;
int day;
}DATE;
typedef struct student
{
long studentid;
char studentname[10];
char studentsex;
DATE birthday;
int score[4];
float aver;
}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=4;
printf("How many students?");
scanf("%d",&n);
inputscore(stu,n,m);
averscore(stu,n,m);
writetofile(stu,n);
n = readfromfile(stu);
printscore(stu,n,m);
}
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);
scanf(" %c",&stu[i].studentsex);
scanf("%d",&stu[i].birthday.year);
scanf("%d",&stu[i].birthday.month);
scanf("%d",&stu[i].birthday.day);
for(j=0;j<m;j++)
{
scanf("%d",&stu[i].score[j]);
}
}
}
void averscore(STUDENT stu[],int n,int m)
{
int i,j,sum;
for(i=0;i<n;i++)
{
sum=0;
for(j=0;j<m;j++)
{
sum= sum+stu[i].score[j];
}
stu[i].aver = (float)sum/m;
}
}
void writetofile(STUDENT stu[],int n)
{
FILE *fp;
if((fp = fopen("student.txt","w"))==NULL)
{
printf("Failure to open student.txt!\n");
exit(0);
}
fwrite(stu,sizeof(STUDENT),n,fp);
fclose(fp);
}
int readfromfile(STUDENT stu[])
{
FILE *fp;
int i;
if((fp=fopen("student.txt","r"))==NULL)
{
printf("Failure to open student.txt!\n");
exit(0);
}
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;
}
void printscore(STUDENT stu[],int n,int m)
{
int i,j;
for(i=0;i<n;i++)
{
printf("%10ld%8s%3c%6d/%02d/%02d",stu[i].studentid,stu[i].studentname,stu[i].studentsex,stu[i].birthday.year,stu[i].birthday.month,stu[i].birthday.day);
for(j=0;j<m;j++)
{
printf("%4d",stu[i].score[j]);
}
printf("%6.lf\n",stu[i].aver);
}
}