`

lseek函数的用法

    博客分类:
  • ARM
阅读更多

所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了O_APPEND 

    使用 lseek 函数可以改变文件的 cfo 。

        #include <unistd.h>

        #include <sys/types.h>

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

                    返回值:新的偏移量(成功),-1(失败)

参数 offset 的含义取决于参数 whence:

    1. 如果 whence 是 SEEK_SET,文件偏移量将被设置为 offset。
    2. 如果 whence 是 SEEK_CUR,文件偏移量将被设置为 cfo 加上 offset,
       offset 可以为正也可以为负。
    3. 如果 whence 是 SEEK_END,文件偏移量将被设置为文件长度加上 offset,
       offset 可以为正也可以为负。

SEEK_SET、SEEK_CUR 和 SEEK_END 是 System V 引入的,在这之前使用的是 0、1 和 2。

    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)决定的。

    以下程序创建一个有空洞的文件:

        /* Standard C header */
        #include <stdio.h>
        /* Unix header */
        #include <fcntl.h>
        #include <unistd.h
>
        #include <sys/stat.h>

        char    buf1[] = "abcdefghij";
        char    buf2[] = "ABCDEFGHIJ";

        int main(void)
        {
            int     fd, size;

            if ((fd = creat("file.hole", S_IRUSR|S_IWUSR)) < 0)
            {
                printf("creat error\n");
                return -1;
            }

            size = sizeof buf1 - 1;
            if (write(fd, buf1, size) != size)
            {
                printf("buf1 write error\n");
                return -1;
            }
            /* offset now = 10 */

            if (lseek(fd, 16384, SEEK_SET) == -1)
            {
                printf("lseek error\n");
                return -1;
            }
            /* offset now = 16384 */

            size = sizeof buf2 - 1;
            if (write(fd, buf2, size) != size)
            {
                printf("buf2 write error\n");
                return -1;
            }
            /* offset now = 16394 */

            return 0;
        }

 

摘自:http://blog.csdn.net/songyang516/article/details/6779950

同时也可以参考:http://baike.baidu.com/view/1080860.htm

 

分享到:
评论

相关推荐

    C语言中lseek()函数和fseek()函数的使用详解

    与`lseek()`不同,`fseek()`不会直接返回新的读写位置,因此如果需要获取当前位置,应使用`ftell()`函数。 下面是一个简单的示例,展示了`fseek()`和相关函数的用法: ```c #include int main() { FILE *stream...

    文件IO接口函数功能说明以及函数用法

    本文将详细讲解几个重要的文件IO接口函数,包括它们的功能、使用方法及参数说明。 首先,文件描述符是操作文件的核心概念,它是一个非负整数,如0(标准输入stdin)、1(标准输出stdout)和2(标准错误stderr)。接...

    linux_C函数库中文手册

    手册中详细介绍了各种函数的功能、用法和常见错误代码。以下是根据给定文件内容提取的知识点: ### 1. 文件操作函数 - `readdir` 用于读取目录项。 - `write` 函数用于向文件描述符指定的文件中写入数据。 - `fcntl...

    FATFS常用函数详解

    这些定义为后续函数的使用提供了基础框架。 #### 2. f_read8 `f_read8` 函数用于从文件中读取单个字节的数据。该函数接受一个文件指针作为参数,并返回读取的字节值。如果遇到文件结尾或发生错误,则返回-1。 示例...

    FATFS.zip_fatfs使用方法_fatfs函数_fatfs分析_fatfs用途_local5cc

    《深入理解FATFS:使用方法、函数解析与应用探讨》 在嵌入式系统开发中,文件系统扮演着至关重要的角色,它使得设备能够管理和处理数据存储。FATFS,全称为“File Allocation Table File System”,是Renesas ...

    linuxc 函数详解

    本文将详细探讨这些函数以及它们的使用方法和相关的历程。 首先,Linux系统下有大量的系统调用函数,它们大致可以分为以下几类: 1. 文件操作类系统调用:这类系统调用用于文件的创建、删除、读写等操作。例如,...

    Linux C函数参考手册

    - **参数说明**:解释函数参数的意义和使用方法。 - **返回值**:描述函数执行成功后的返回结果以及可能的错误码。 - **示例代码**:通过实例演示函数的正确使用方式,帮助读者理解其工作原理。 通过阅读和理解...

    Linux应用编程和网络编程

    其中,不仅详细解释了各个API的使用方法,还涵盖了文件描述符等核心概念,对Linux系统中的文件操作有了深入的探讨。此外,文档也涉及了对标准IO库的认识,这有助于开发者在编程中灵活运用,并写出更加高效、优雅的...

    linux unix 函数手册

    《Linux Unix 函数手册》全面覆盖了这些函数的使用方法、参数、返回值以及可能的错误情况,对于理解和使用这些函数至关重要。通过深入学习这个手册,开发者可以更高效、更稳定地编写Linux和Unix平台上的应用程序。

    Linux C 函数.rar

    通过阅读“Linux C 函数.chm”文档,开发者可以深入了解上述各个方面的函数用法、注意事项以及实际应用案例,从而更好地利用C语言进行Linux系统编程。这个资源对于初学者和有经验的开发者都是一个宝贵的参考工具。

    c语言 - c常用函数和头文件

    根据提供的文件信息,我们可以整理出一系列与C语言相关的函数及头文件的重要知识点。这些知识点将按照函数所属的头文件进行分类,并对每个函数的作用...熟练掌握这些函数的使用方法对于编写高质量的C语言程序至关重要。

    Linux下c函数

    在Linux操作系统中,C语言是基础且强大的编程工具,它为开发者提供了丰富的函数库来实现各种功能。以下是对Linux下C语言函数的...同时,理解这些函数的工作原理和使用方法,有助于编写出更加稳定、高效和安全的代码。

    C语言通用范例开发金典.part2.rar

    ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.7 双亲、孩子和兄弟节点的查询(链式结构) 162 范例1-61 双亲、孩子和兄弟节点的查询 162 ∷相关函数:Parent函数 ...

    Unix_Linux实验报告五 Linux C 语言编程.doc

    我们也了解了 open 函数、write 函数、lseek 函数和 read 函数的使用方法。 五、结论 通过本实验,我们掌握了 Linux C 语言编程的基本知识,并了解了系统调用和库函数的使用方法。这些知识将在后续的实验中被应用...

    C语言通用范例开发金典.part1.rar

    ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.8 中序遍历二叉树(顺序结构) 169 范例1-62 中序遍历二叉树 169 ∷相关函数:InOrderTraverse函数 1.4.9 中序遍历...

    C 开发金典

    ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.7 双亲、孩子和兄弟节点的查询(链式结构) 162 范例1-61 双亲、孩子和兄弟节点的查询 162 ∷相关函数:Parent函数 ...

    fatfs操作函数.txt

    在找到第一个匹配条目后,可以使用此函数继续查找后续的匹配项。 - **f_stat**: 获取文件状态信息。可以获取文件的各种属性,如大小、创建时间等。 - **f_unlink**: 删除文件。从文件系统中删除一个文件。 - **f_...

    Linux C函数集

    通过这个"Linux C函数集",开发者可以深入理解这些基本功能的用法,从而更好地在Linux环境下编写高效、可靠的程序。学习和熟练掌握这些函数是Linux系统编程的基础,也是成为一名优秀的Linux开发者的关键步骤。无论是...

    linux常用函数

    ### Linux常用函数详解 Linux作为一款广泛使用的操作系统,在软件开发领域具有重要的地位。本文将针对提供的部分Linux常用函数进行深入解读...通过掌握这些函数的使用方法,可以帮助开发者更高效地进行软件开发工作。

    Python3 菜鸟查询手册

    21.29 os.lseek() 方法.png 21.30 os.lstat() 方法.png 21.31 os.major() 方法.png 21.32 os.makedev() 方法.png 21.33 os.makedirs() 方法.png 21.34 os.minor() 方法.png 21.35 os.mkdir() 方法.png 21.36...

Global site tag (gtag.js) - Google Analytics