文件5

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

四、文件定位
 文件位置指针:表示的是读取的位置。
 (1)rewind
 格式:rewind(fp);
 功能:重置文件位置指针到起始位置。
 (2)fseek
 格式:fseek(fp,offset,base)
 功能:将文件的位置指针置于距离base偏移量为offset的位置。
 fp:文件指针  offset:偏移量   base:基准位置。(0:文件首  1:当前位置  2:文件尾部)
 fseek(fp,0,0);  //rewind(fp)等价
 fseek(fp,100L,0);//置位置指针到距离文件首100L的位置
问题:有10个学生数据,学生信息(姓名,学号,成绩),
输入顺序编号,输出该生的全部信息。(利用文件)
分析:
     struct student
  {
     char name[20];
  long number;
  int score;
  };
  typedef struct student stu;
拓展1:根据输入的编号(5个),生成一个新的班级(xst.dat)

分析:
     遍历所有编号i
  {
     移动位置指针到第i个记录位置;
  读出该记录;
  放到新文件xst.dat文件中
  }
拓展2:将原始数据文件(allst.dat)的内容从高到低排序。  
分析:
     可以将文件的内容读入到一个数组中;
  对数组内容排序;
  利用数组内容建立一个和原先文件同名的文件。
*/
#include <stdio.h>
struct student
  {
     char name[20];
  long number;
  int score;
  };
typedef struct student stu;
void sort()
{
FILE *fp;  stu tt[100],st;
int i,j,n=0;//n表示记录个数
fp=fopen("d:\\test\\allst.dat","rb");
while (fread(&st,sizeof(stu),1,fp)==1)
 tt[n++]=st;
fclose(fp);
//将长度为n的数组tt从高到低排序
for(i=0;i<n-1;i++)
 for(j=i+1;j<n;j++)
  if (tt[i].score<tt[j].score)
  {st=tt[i];tt[i]=tt[j];tt[j]=st;}
   //跟据数组tt建立一个同名的数据文件
    fp=fopen("d:\\test\\allst.dat","wb");
 for(i=0;i<n;i++)
  fwrite(&tt[i],sizeof(stu),1,fp);
 fclose(fp);    
}
void fenban(int tt[],int n)
{
FILE *fp,*fp1;
stu st;
int i;
fp=fopen("d:\\test\\allst.dat","rb");
fp1=fopen("d:\\test\\xst.dat","wb");
for(i=0;i<n;i++)
{
 fseek(fp,tt[i]*sizeof(stu),0);//移动位置指针到tt[i]个记录的位置
 fread(&st,sizeof(stu),1,fp);
 fwrite(&st,sizeof(stu),1,fp1);
}
fclose(fp);
fclose(fp1);
}
void save()
{
FILE *fp;
int i;
stu st;
fp=fopen("d:\\test\\allst.dat","wb");
for(i=0;i<10;i++)
{
 scanf("%s%ld%d",st.name,&st.number,&st.score);
 fwrite(&st,sizeof(stu),1,fp);
}
fclose(fp);
}
void read()
{
FILE *fp;
stu st;
fp=fopen("d:\\test\\allst.dat","rb");
while (fread(&st,sizeof(stu),1,fp)==1)
 printf("%s,%ld,%d\n",st.name,st.number,st.score);
fclose(fp);
}
void read1()
{
FILE *fp;
stu st;
fp=fopen("d:\\test\\xst.dat","rb");
while (fread(&st,sizeof(stu),1,fp)==1)
 printf("%s,%ld,%d\n",st.name,st.number,st.score);
fclose(fp);
}
//设计一个函数寻找编号为n的学生
stu findn(int n)
{
FILE *fp;
stu st;
fp=fopen("d:\\test\\allst.dat","rb");
//移动位置到第n个记录位置
fseek(fp,n*sizeof(stu),0);
fread(&st,sizeof(stu),1,fp);
fclose(fp);
return st;
}

int main()
{
int n,tt[5],i;
stu st;
//save();
read();
sort();
printf("the sort data:\n");
read();
//for(i=0;i<5;i++)
 //scanf("%d",&tt[i]);
//fenban(tt,5);
//read1();
//scanf("%d",&n);
//st=findn(n);
//printf("%s,%ld,%d\n",st.name,st.number,st.score);
return 0;
}

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

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