Linux系统编程—文件—lseek函数

系统手册lseek定义

输入man lseek命令可看到系统对lseek函数说明如下
Linux系统编程—文件—lseek函数_第1张图片
使用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:

  1. 如果 whence 为SEEK_SET,offset相对于文件开头进行偏移
  2. 如果 whence 为 SEEK_END,offset相对于文件末尾进行偏移
  3. 如果 whence 为 SEEK_CUR,offset相对文件当前位置进行偏移

例如:
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;
}

Linux系统编程—文件—lseek函数_第2张图片
可以看到和上文效果一样,测试没问题
下面用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;
}
~   

Linux系统编程—文件—lseek函数_第3张图片
wo hen shuai是十个字母加两个空格,刚好是12

你可能感兴趣的:(Linux,linux)