前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据,但在实际问题中长需要只读取文件中的某一个指定部分;为了解决这个问题可以移动文件内部的位置到需要读写的位置,在进行读写,这种称为随机读写;
实现随机读写的关键是要按要求移动位置指针,这成为文件的定位
完成文件定位的函数有: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、释放内存