这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 5.文件的随机读写

共1条 1/1 1 跳转至

5.文件的随机读写

高工
2014-10-29 17:25:10     打赏

  前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据。但在实际问题中常要求只读写文件中某一指定的部分。为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。

  实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。


  文件定位


  移动文件内部位置指针的函数主要有两个,即rewind()和fseek()。

  rewind函数前面已多次使用过,其调用形式为:

  rewind(文件指针);

  它的功能是把文件内部的位置指针移到文件首。

  下面主要介绍fseek函数。fseek函数用来移动文件内部位置指针,其调用形式为:

  fseek(文件指针,位移量,起始点);

  其中:

  “文件指针”指向被移动的文件。

  “位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB 时不会出错。当用常量表示位移量时,要求加后缀“L”。

  “起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。

  其表示方法如下表:

                  


  例如:

  fseek(fp,100L,0);

  其意义是把位置指针移到离文件首100个字节处。

  还要说明的是fseek函数一般用于二进制文件。在文本文件中由于要进行转换,故往往计算的位置会出现错误。


  文件的随机读写


  在移动位置指针之后,即可用前面介绍的任一种读写函数进行读写。由于一般是读写一个数据据块,因此常用fread和fwrite函数。下面用例题来说明文件的随机读写。


  【例13-8】在学生文件stu_list中读出第二个学生的数据。

  #include

  struct stu{

  char name[10];

  int num;

  int age;

  char addr[15];

  }boy,*qq;

  main(){

  FILE *fp;

  char ch;

  int i=1;

  qq=&boy;

  if((fp=fopen("stu_list","rb"))==NULL){

  printf("Cannot open file strike any key exit!");

  getch();

  exit(1);

  }

  rewind(fp);

  fseek(fp,i*sizeof(struct stu),0);

  fread(qq,sizeof(struct stu),1,fp);

  printf("\n\nname\tnumber age addr\n");

  printf("%s\t%5d %7d %s\n",qq->name,qq->num,qq->age,qq->addr);

  }


  文件stu_list已由【例13-6】的程序建立,本程序用随机读出的方法读出第二个学生的数据。程序中定义boy为stu类型变量,qq为指向boy的指针。以读二进制文件方式打开文件,程序第19行移动文件位置指针。其中的i值为1,表示从文件头开始,移动一个stu类型的长度,然后再读出的数据即为第二个学生的数据。



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]