输入man lseek命令可看到系统对lseek函数说明如下
使用lseek函数需要包含以下头文件:
#include <sys/types.h>
#include <unistd.h>
lseek函数定义 :
off_t lseek(int fd, off_t offset, int whence);
有三个参数:
fd:文件描述符
offset:文件偏移量
whence:文件偏移相对位置
参数 offset为负数时向文件开头偏移,正数向文件末尾偏移,0则为不偏移
参数 offset 的含义取决于参数 whence:
例如:
lseek(i fd, 0, SEEK_SET)为光标开头偏移0,即光标置于最开头。
lseek(i fd, 0, SEEK_END)为光标末端偏移0,即光标置于最末尾。
返回值:
成功:返回文件的偏移量
失败:-1
甚至可以两次调用不同偏移值的lseek通过返回值可以巧妙地取代sizeof来计算长度。
用lseek来重置光标,代替上文的关闭再打开文件这样操作
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int fd;
char *buf="wo hen shuai";
fd=open("./file1",O_RDWR);
if(fd==-1){
printf("open file1 failed\n");
fd=open("./file1",O_RDWR|O_CREAT,0600);
if(fd>0){
printf("creat file1 success\n");
}
}
printf("open successs fd=%d\n",fd);
int n_write=write(fd,buf,strlen(buf));
if(n_write!=-1){
printf("write %d byte to file1\n",n_write);
}
lseek(fd,0,SEEK_SET);
char *readbuf;
readbuf=(char *)malloc(sizeof(char)*n_write+1);
int n_read=read(fd,readbuf,n_write);
printf("read:%d,context:%s\n",n_read,readbuf);
close(fd);
return 0;
}
可以看到和上文效果一样,测试没问题
下面用lseek来计算字符串长度
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int fd;
char *buf="wo hen shuai";
fd=open("./file1",O_RDWR);
int filesize=lseek(fd,0,SEEK_END);
printf("file's size is:%d\n",filesize);
close(fd);
return 0;
}
~