fseek()函数:
作用:重定位文件内部指针的位置。
头文件包含:#include <stdio.h>
函数原型:int fseek(FILE *stream, long offset, int whence);
参数解析:stream为文件打开后的流(文件内部)指针(FILE *);offset为偏移量(正数为从文件头向文件尾的偏移方向,负数相反,0不偏移);fromwhere为指针定位的位置(SEEK_SET: 文件开头,SEEK_CUR: 当前位置,SEEK_END: 文件结尾)
返回值:成功返回偏0,错误返回-1。
举例说明:
fseek(fp,5L,SEEK_SET);把文件内部指针移动到离文件开头5字节处;
fseek(fp,5L,SEEK_CUR);把文件内部指针移动到离文件当前位置5字节处(指的是当前位置往后);
fseek(fp,-5L,SEEK_END);把文件内部指针退回到离文件结尾5字节处。
注:有时可用0,1和2表示SEEK_SET,SEEK_CUR和SEEK_END。
ftell()函数:
作用:函数 ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。
头文件包含:#include <stdio.h>
函数原型: long ftell(FILE *stream);
参数解析:stream为文件打开后的流(文件内部)指针(FILE *)。
返回值:成功返回偏移量的,失败返回-1。
举例说明:
计算文件中包含的所有字节数。
第一步:fseek(fp, 0,SEEK_END); //将文件指移到文件的末尾。
第二步:len =ftell(fp)+1; //调用函数ftell()获得当前位置相对于文件首的位移,该位移值等于文件所含字节数。
rewind()函数:
作用:将文件内部的位置指针重新指向一个流(数据流/文件)的开头。
头文件包含:#include <stdio.h>
函数原型: void rewind(FILE *stream);
参数解析:stream为文件打开后的流(文件内部)指针(FILE *)。
返回值:无返回值。
举例说明:rewind( fp ); //文件内部指针将重新 指向文件开头。
结合实例来理解fseek()和ftell()函数:
void dofile(char *filename)
{
FILE *f;
long len;
char *data;
f=fopen(filename,"rb"); // 以只读的方式打开
fseek(f,0,SEEK_END); // 把文件内部指针移到文件的末尾
len=ftell(f)+1; // 计算出整个文件的字节数
fseek(f,0,SEEK_SET); // 再把文件内部指针移到文件的开头
data=(char*)malloc(len); // 申请内存
fread(data,1,len,f); // 把f中的内容读取到data内存中去,每次读一个字节,总共读取len个。
fclose(f); // 关闭文件
doit(data); // 本代码是摘抄自cJSON项目,doit()函数是文件处理函数,这时候
// 是用来处理data内存中所存的数据,处理成JSON格式,并打印出来。
free(data); // 释放申请的内存
}
lseek()函数:
lseek()函数可以看作为:lseek()函数=fseek()函数+ftell()函数
作用:以文件开头,结尾,当前位置为基准点进行偏移,对文件偏移指针重新定位!定位完成,返回定位之后的文件偏移指针到文件开头的距离,但是指针停留在移动到的位置。
头文件包含: #include <sys/types.h>
#include <unistd.h>
函数原型: off_t lseek(int fd, off_t offset, int whence);
参数解析:fd为文件描述符,offset,为偏移量,whence为偏移基准。
返回值:成功返回定位之后的文件偏移指针到文件开头的距离,失败返回-1。
举例说明:
int main(int argc, char *argv[])
{
int fd = -1; // fd 就是file descriptor,文件描述符
char buf[20] ={0};
char writebuf[10] = "abcd";
int ret = -1;
// 第一步:打开文件
fd = open("a.txt", O_RDWR | O_CREAT);
if (-1 == fd) // 有时候也写成: (fd < 0)
{
//printf("\n");
perror("文件打开错误");
// return -1;
_exit(-1);
}
else
{
printf("文件打开成功,fd = %d.\n", fd);
ret = lseek(fd, 2, SEEK_SET);
printf("lseek,文件指针举例开头的距离 ret = %d.\n", ret);//ret=2
read(fd, buf, 2);
printf("文件内容是:[%s].\n", buf); //a.txt中的内容为dashunihao,则打印出来的内容是sh
}