• lseek() 定位一个已经打开的文件


    Lseek

    lseek()的作用是,设置文件内容的读写位置。

      每个打开的文件都有一个“当前文件偏移量”,是一个非负整数,用以度量从文件开始处计算的字节数。通常,读写操作都是从当前文件偏移量处开始,并使偏移量增加所读或写的字节数。默认情况下,你打开一个文件(open),除非指定O_APPEND参数,不然位移量被设为0。

    使用lseek()需要包含的头文件:<sys/types.h>,<unistd.h>

    函数原型:

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

      off_t是系统头文件定义的数据类型,相当于signed int

    参数:

      fd:是要操作的文件描述符

      whence:是当前位置基点。

        SEEK_SET,以文件的开头作为基准位置,新位置为偏移量的大小。

        SEEJ_CUR,以当前文件指针的位置作为基准位置,新位置为当前位置加上偏移量。

        SEEK_END,以文件的结尾为基准位置,新位置位于文件的大小加上偏移量。

      offset:偏移量,要偏移的量。可正可负(向后移、向前移);

    返回值:

      成功返回相对于文件开头的偏移量。    出错返回-1

     1 #include <stdio.h>
     2 #include <fcnlt.h>
     3 #include <sys/types.h>
     4 #include <sys/stat.h>
     5 #include <unity.h>
     6 
     7 int main(int argc, char * argv[])
     8 {
     9     int fd;
    10     char buf[100];
    11     if ((fd = open(argv[1], O_RDONLY)) < 0) {
    12         perror("open");
    13         exit(-1);
    14     }
    15     read(fd, buf, 1);
    16     write(STDOUT_FILENO, buf, 1);
    17     lseek(fd, 2, SEEK_CUR);
    18 
    19     read(fd, buf, 1);
    20     write(STDOUT_FILENO, buf, 1);
    21     lseek(fd, -1, SEEK_END);
    22 
    23     read(fd, buf, 1);
    24     write(STDOUT_FILENO, buf, 1);
    25     lseek(fd, 0, SEEK_SET);
    26 
    27     read(fd, buf, 1);
    28     write(STDOUT_FILENO, buf, 1);
    29     close(fd);
    30     printf("
    ");
    31 
    32     return 0;
    33 }
  • 相关阅读:
    Spring源码:Spring IoC容器加载过程(1)
    Spring源码:Spring IoC容器加载过程(2)
    logback日志异步打印
    Spring Boot学到的内容
    JavaScript——数组的indexOf()方法在IE8中的兼容性问题
    聊聊字符串拼接的哪一些事儿
    C# LINQ学习笔记五:LINQ to XML
    聊聊多线程那一些事儿(task)之 三 异步取消和异步方法
    C# 中的IComparable和IComparer
    .net core 简单定时程序
  • 原文地址:https://www.cnblogs.com/chen-farsight/p/6023684.html
Copyright © 2020-2023  润新知