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

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

完成文件定位的函数有:rewind,fseek函数

1、rewind复位读写位置:只要调用了这个函数读写位置就会到文件开始

       rewind 函数:void rewind(文件指针)

       函数功能:把文件内部的位置指针移到文件首

       调用形式:rewind(文件指针)

例1

fwirte(pa,sizeof(struct stu),2,fp);
wewind(fp);
fread(pb,sizeof(struct stu),2,fp);

 2、ftell测文件读写位置距文件开始有多少个字节:

     定义函数:long ftell(文件指针)

     函数功能:取的文件流目前的读写位置

     返回值:返回当前读写位置(距离文件起始的字节数),出错时返回-1;

int length;
length=ftell(fp);

 3、fseek定位位置指针(读写位置):对文件的读写位置进行设置

   fseek函数(一般用于二级制文件即打开文件的方式需要带b)

   函数声明:

int fseek(FILE *stream,long offset,int whence);
                   //int fseek(文件类型指针,位移量,起始点);

   函数功能:移动文件流的读写位置

   参数:whence起始位置。

               文件开头     SEEK_SET        0

               文件当前位置                   SEEK_CUR        1

               文件末尾                    SEEK_END        2

 位移量:以起始点为基点,向前向后移动的字节数,正数是往文件末尾方向偏移,负数相反

  例

fseek(fp,50,SEEK_SET)//从文件开头向后偏移50个字节
fseek(fp,-50,SEEK_END);//从文件末尾向前偏移50个
fseek(fp,0,SEEK_END);

 

 练习:讲一个位置大小的文件(文本文件)全部读入内存,并显示在屏幕上

      参考:fseek,ftell,rewind,fread,malloc

1、打开文件fopen,注意用b的方式打开

2、定位文件的读写位置到文件的末尾fseek

3、测文件的字节数len       ftell

4、复位读写位置到文件的开始rewind

5、根据第三步得到的字节数,申请内存malloc注意多申请一个存放“\0”;

6、从文件中读取内容,存到申请的空间里fread

7、最后一个字节变成“\0”;

8、打印读出来的内容到屏幕上,printf

9、关闭文件fclose

10、释放内存