文件4

作者: 时间:2020-07-09 点击数:

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:求素数的个数?

 

Copyright© 2020 Anyang Institute of Technology.All rights reserved.

学院地址:河南省安阳市黄河大道西段