C语言中常见文件访问指针函数,fseek()、ftell()、rewind()和lseek()的用法(通俗易懂)

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
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值