3、记录式读/写
适合于二进制文件
函数:fread、fwrite
格式:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
buffer:读/写数据的存放位置(地址)
size:记录长度 (sizeof)
count:记录个数
fp:文件指针
fread函数返回值:成功读取的记录个数
读任意记录个数的文件
while (fread(&st,sizeof(记录类型),1,fp)==1)
{
//处理读出来的记录
}
*/
/*
问题:一个班有5个学生,学生信息(姓名,成绩,籍贯),利用文件实现:
(1)求全班的平均成绩
(2)求来自武汉的学生人数
分析:
struct student
{
char name[20];
char jg[40];
int score;
};
typedef struct student stu;
//设计一个输入数据的函数save()
void save()
{
FILE *fp;
stu st;
int i;
fp=fopen("d:\\test\\f1.dat","wb");
for(i=0;i<5;i++)
{
scanf("%s%s%d",st.name,st.jg.&st.score);
fwrite(&st,sizeof(stu),1,fp);
}
fclose(fp);
}
void read()
{
FILE *fp;
stu st;
fp=fopen("d:\\test\\f1.dat","rb");
while (fread(&st,sizeof(stu),1,fp)==1)
{
printf("%s,%s,%d\n",st.name,st.jg,st.score);
}
fclose(fp);
}
//设计一个函数求平均成绩average()
float average()
{
FILE *fp;
stu st;
int i=0;
float sum=0;
fp=fopen("d:\\test\\f1.dat","rb");
while (fread(&st,sizeof(stu),1,fp)==1)
{
sum=sum+st.score;i++;
}
fclose(fp);
return sum/i;
}
//设计一个函数求来自wuhan的人数
int count()
{
FILE *fp;
stu st;
int cnt=0;
fp=fopen("d:\\test\\f1.dat","rb");
while (fread(&st,sizeof(stu),1,fp)==1)
{
if (strcmp(st.jg,"wuhan")==0) cnt++;
}
fclose(fp);
return cnt;
}
*/
/*
#include <stdio.h>
#include <string.h>
struct student
{
char name[20];
char jg[40];
int score;
};
typedef struct student stu;
//设计一个输入数据的函数save()
void save()
{
FILE *fp;
stu st;
int i;
fp=fopen("d:\\test\\f1.dat","wb");
for(i=0;i<5;i++)
{
scanf("%s%s%d",st.name,st.jg,&st.score);
fwrite(&st,sizeof(stu),1,fp);
}
fclose(fp);
}
void read()
{
FILE *fp;
stu st;
fp=fopen("d:\\test\\f1.dat","rb");
while (fread(&st,sizeof(stu),1,fp)==1)
{
printf("%s,%s,%d\n",st.name,st.jg,st.score);
}
fclose(fp);
}
//设计一个函数求平均成绩average()
float average()
{
FILE *fp;
stu st;
int i=0;
float sum=0;
fp=fopen("d:\\test\\f1.dat","rb");
while (fread(&st,sizeof(stu),1,fp)==1)
{
sum=sum+st.score;i++;
}
fclose(fp);
return sum/i;
}
//设计一个函数求来自wuhan的人数
int count()
{
FILE *fp;
stu st;
int cnt=0;
fp=fopen("d:\\test\\f1.dat","rb");
while (fread(&st,sizeof(stu),1,fp)==1)
{
if (strcmp(st.jg,"wuhan")==0) cnt++;
}
fclose(fp);
return cnt;
}
int main()
{
float ave;
int rs;
//save();
read();
ave=average();
printf("%.2f\n",ave);
rs=count();
printf("%d\n",rs);
return 0;
}
*/
/*
拓展:求来自任意一个城市的学生人数
主函数:char cs[40];
gets(cs);
int count(char *s)
{
......
.....
if (strcmp(st.jg,s)==0) cnt++;
......
}
*/
/*
4、格式化文件读写
fprintf、fscanf
格式:
fprintf(fp,"控制字符串", 参数表);
fscanf(fp,"控制字符串", 参数表);
%d %s %c %f
fprintf(fp,"%d",x);
fscanf(fp,"%d",&x);
读任意数据个数的文件:
while (fscanf(fp,"控制字符串",参数表)==1)
{
处理数据
}
*/
/*
问题:一批成绩(5个)存放在文件中,统计不及格的人数。
分析:
//设计一个函数建立数据文件
void save()
{
FILE *fp;
int i,x;
fp=fopen("d:\\test\\f2.dat","wb");
for(i=0;i<5;i++)
{
scanf("%d",&x);
fprintf(fp,"%d ",x); //在os眼中都是字符流,注意数据间隔
}
fclose(fp);
}
//设计一个统计函数count
int count()
{
FILE *fp;
int x,cnt=0;
fp=fopen("d:\\test\\f2.dat","rb");
while (fscanf(fp,"%d",&x)==1)
{
if (x<60) cnt++;
}
fclose(fp);
return cnt;
}
*/
#include <stdio.h>
//设计一个函数建立数据文件
void save()
{
FILE *fp;
int i,x;
fp=fopen("d:\\test\\f2.dat","wb");
for(i=0;i<5;i++)
{
scanf("%d",&x);
fprintf(fp,"%d ",x); //在os眼中都是字符流,注意数据间隔
}
fclose(fp);
}
//设计一个统计函数count
int count()
{
FILE *fp;
int x,cnt=0;
fp=fopen("d:\\test\\f2.dat","rb");
while (fscanf(fp,"%d",&x)==1)
{
if (x<60) cnt++;
}
fclose(fp);
return cnt;
}
int main()
{
int k;
//save();
k=count();
printf("%d\n",k);
return 0;
}
/*
拓展1:求平均成绩
拓展2:求最高成绩
拓展3:求素数的个数?