lseek函数的用法

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

大家好,又见面了,我是你们的朋友全栈君。

所有打开的文件都有一个当前文件偏移量(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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149995.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • rtp载荷类型_架体荷载

    rtp载荷类型_架体荷载 1简介在Internet上用分组传送话音的质量不够好的一个重要原因是比较高的丢包率。尤其在广域网中,这个问题相当突出。不幸的是,实时多媒体业务对于延时的要求相当严格,因此不大可能通过重传来解决丢包的问题。正是出于这个原因,大家提出用前向纠错(FEC)来解决Internet上的丢包问题[1][2]。尤其是对于传统纠错码如校验码、RS码、汉明码等的使用引起了很多人的注意。为了能够更好地应用这些纠错码

    2022年8月11日
    5
  • spss数据分析聚类分析_SPSS聚类分析

    spss数据分析聚类分析_SPSS聚类分析SPSS之聚类分析(图文+数据集)聚类分析简介按照个体(记录)的特征将它们分类,使同一类别内的个体具有尽可能高的同质性,而类别之间则具有尽可能高的异质性。为了得到比较合理的分类,首先要采用适当的指标来定量地描述研究对象之间的联系的紧密程度。假定研究对象均用所谓的“点”来表示。在聚类分析中,一般的规则是将“距离”较小的点归为同一类,将“距离”较大的点归为不…

    2022年10月17日
    2
  • 忘记 mysql 数据库连接密码(解决方案)「建议收藏」

    由于CSDN的目录只在固定地方显示,并不是很方便阅读,又占空间,所以本文章已同步更新到个人博客上,在个人博客上的文章,有滑动侧边目录栏,阅读体验更加,而且文章的样式也更为丰富,推荐各位同学前往我的个人博客读阅。个人博客地址:http://zwd596257180.gitee.io/blog/2019/04/16/mysql_change_password/…

    2022年4月13日
    73
  • lm358红外接收电路_熔断器用于电路的什么保护

    lm358红外接收电路_熔断器用于电路的什么保护 §01红外检测一、实验背景在很多场合需要使用到物体光电检测,常用到的方法就是使用调制的红外发射管照射物体,通过物体的反射将调试的红外光线送入红外光电检测管,经过放大检测之后反映物体是否存在以及相对的远近。之所以需要对于检测的红外光线进行调试主要是为了避免环境光线的影响。特别是室外的日光中包含有大量的红外线。在反射式红外光电管ITR8307、利用反射光电管ITR9909制作节能信标光电感应开关分别测试了基于反射式一体化红外光电管检测方案。其中使用了ESP32进行实验。

    2025年8月6日
    2
  • 汉字字典树[通俗易懂]

    汉字字典树[通俗易懂]字典树的概念我就不说了,不过大多题目都是英文的字典树,我就闲的蛋疼去写了中文的字典树,实现起来也挺简单的。#include&lt;iostream&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;stdio.h&gt;#include&lt;map&gt;usingnamespacestd;…

    2025年9月23日
    5
  • springboot 2.0 springboottest 事物自动回滚,事物不自动回滚 @Transactional @Rollback[通俗易懂]

    springboot 2.0 springboottest 事物自动回滚,事物不自动回滚 @Transactional @Rollback[通俗易懂]@Transactional//支持事物,@SpringBootTest事物默认自动回滚@Rollback//事务自动回滚,不自动回滚@Rollback(false)packagecom.urthink.upfs.springbootmybatis;importcom.github.pagehelper.PageHelper;importcom.github.pageh…

    2022年5月18日
    120

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号