zoukankan      html  css  js  c++  java
  • 函数名: lseek

    函数名: lseek
    功 能: 移动文件读/写指针
    头文件:#include <sys/types.h> #include <unistd.h>
    用 法: off_t lseek(int handle, off_t offset, int fromwhere);
    所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了 O_APPEND 。
    使用 lseek 函数可以改变文件的 cfo 。
    lseek 的以下用法返回当前的偏移量
    off_t currpos;
    currpos = lseek(fd, 0, SEEK_CUR);
    这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数 fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket,lseek 返回 -1 并且置 errno 为 ESPIPE。
    对于普通文件(regular file),cfo 是一个非负整数。但对于特殊设备,cfo 有可能是负数。因此,我们不能简单地测试 lseek 的返回值是否小于 0 来判断 lseek 成功与否,而应该测试 lseek 的返回值是否等于 -1 来判断 lseek 成功与否。
    lseek 仅将 cfo 保存于内核中,不会导致任何 I/O 操作。这个 cfo 将被用于之后的读写操作。
    如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬盘空间是由文件系统(file system)决定的。

    编辑本段程序例

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <fcntl.h>
    int main(void)
    {
        int handle;
        char msg[] = "This is a test";
        char ch;
        /* create a file */
        handle = open("TEST.$$$", O_CREAT | O_RDWR, S_IREAD | S_IWRITE);
        /* write some data to the file */
        write(handle, msg, strlen(msg));
        /* seek to the begining of the file */
        lseek(handle, 0L, SEEK_SET);
        /* reads chars from the file until we hit EOF */
        do
        {
            read(handle, &amp;ch, 1);
            printf("%c", ch);
        } while (!eof(handle));
        close(handle);
        return 0;
    }
    
    

    编辑本段Linux C

    相关函数

    dup,open,fseek

    表头文件

    #include<sys/types.h>
    #include<unistd.h>

    定义函数

    off_t lseek(int fildes,off_t offset ,int whence);

    函数说明

    每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头,若是以附加的方式打开文件(如O_APPEND),则读写位置会指向文件尾。当read()或write()时,读写位置会随之增加,lseek()便是用来控制该文件的读写位置。参数fildes 为已打开的文件描述词,参数offset 为根据参数whence来移动读写位置的位移数。
    Offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)。

    参数

    whence为下列其中一种:(SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2).
    SEEK_SET 将读写位置指向文件头后再增加offset个位移量。
    SEEK_CUR 以目前的读写位置往后增加offset个位移量。
    SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
    当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。
    下列是较特别的使用方式:
    1) 欲将读写位置移到文件开头时:
    lseek(int fildes,0,SEEK_SET);
    2) 欲将读写位置移到文件尾时:
    lseek(int fildes,0,SEEK_END);
    3) 想要取得目前文件位置时:
    lseek(int fildes,0,SEEK_CUR);

    返回值

    当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno 会存放错误代码
    可能设置erron的错误代码:
    EBADF: fildes不是一个打开的文件描述符。
    ESPIPE:文件描述符被分配到一个管道、套接字或FIFO。
    EINVAL:whence取值不当。[1]

    附加说明

    Linux系统不允许lseek()对tty装置作用,此项动作会令lseek()返回ESPIPE。
    SEEK_SET 等同于数字0 例如 :lseek(int fildes,0,SEEK_SET);=lseek(int fildes,0,0);
    SEEK_CUR 等同于数字1 例如 :lseek(int fildes,0,SEEK_CUR);=lseek(int fildes,0,1);
    SEEK_END 等同于数字2 例如 :lseek(int fildes,0,SEEK_END);=lseek(int fildes,0,2);
  • 相关阅读:
    LeetCode 81 Search in Rotated Sorted Array II(循环有序数组中的查找问题)
    LeetCode 80 Remove Duplicates from Sorted Array II(移除数组中出现两次以上的元素)
    LeetCode 79 Word Search(单词查找)
    LeetCode 78 Subsets (所有子集)
    LeetCode 77 Combinations(排列组合)
    LeetCode 50 Pow(x, n) (实现幂运算)
    LeetCode 49 Group Anagrams(字符串分组)
    LeetCode 48 Rotate Image(2D图像旋转问题)
    LeetCode 47 Permutations II(全排列)
    LeetCode 46 Permutations(全排列问题)
  • 原文地址:https://www.cnblogs.com/jeanschen/p/3381854.html
Copyright © 2011-2022 走看看