Linux文件编程(lseek函数和stat函数)

2023-07-24 11:55:42


前言

本篇文章来讲解lseek函数和stat函数,lseek函数主要用来设置文件偏移量,stat函数主要用来获取文件属性。

一、lseek函数

lseek 函数用于在打开的文件中移动文件指针的位置。它可以用于设置文件的读写位置或查找特定位置的数据。

函数原型如下:

#include <unistd.h>

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

其中,fd 是需要进行定位的文件描述符;offset 是指定的偏移量;whence 参数指定了基准位置。

lseek 函数的基准位置(whence)参数可以取三个标志之一:

SEEK_SET:基于文件开头设置偏移量。此时,偏移量就是从文件开头开始的字节数。
SEEK_CUR:基于当前文件指针位置设置偏移量。此时,偏移量为当前位置加上给定的偏移量。
SEEK_END:基于文件末尾设置偏移量。此时,偏移量为文件长度加上给定的偏移量。

lseek 函数的返回值为新的文件指针的位置。如果出现错误,返回值为-1。

lseek 函数的主要作用如下:

设置文件指针位置:通过指定不同的偏移量和基准位置,lseek 函数可以在文件中设置文件指针的位置。这样可以控制后续的读写操作从特定位置开始。

查找文件位置:通过将偏移量设置为0并指定正确的基准位置,lseek 函数可以用于查找特定位置的数据,而无需进行实际的读写操作。

需要注意的是,lseek 函数对不支持定位的文件(如终端设备、管道)执行时可能会返回错误。此外,使用 lseek 函数时应确保文件打开模式允许寻位操作。

使用示例:

上篇文章我们其实是使用到了这个函数的,这里就讲解一下上篇文章中这个函数的作用。

在读取文件内容时把读写位置设置到文件的开头,假如不使用这句话的话那么将会从Hello后面开始读取数据,那么将会读取到空的数据。

 lseek(fd, 0, SEEK_SET);

 len = read(fd, buf, 1024);

使用lseek也可以来获取文件的长度:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    int fd = 0;
    char buf[1024];
    int len = 0;

    fd = open("1.txt", O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); //打开文件,如果不存在则创建文件为可读可写,并且将文件内容全部清除

    if(fd == -1)
    {
        printf("open 1.txt is err\n");
        return -1;
    }

    len = write(fd, "Hello", 6);
    if(len == -1)
    {
        printf("write err\n");
    }

    len = lseek(fd, 0, SEEK_END);

    printf("len : %d\n", len);

    return 0;
}


在这里插入图片描述

二、stat函数

stat 函数(或 fstat 函数)是用于获取文件的信息和状态的函数。它提供了关于文件的元数据,例如文件大小、权限、创建时间等信息。

函数原型如下:

#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);

其中,stat 函数用于传入文件路径 path,而 fstat 函数用于传入文件描述符 fd。两个函数的参数 buf 是一个 struct stat 类型的结构体指针,用于存储获取到的文件信息。

struct stat 结构体中包含了各种文件信息的成员,例如:

st_mode:文件类型和权限模式。
st_size:文件大小(以字节为单位)。
st_uid:文件所有者的用户 ID。
st_gid:文件所有者所在组的组 ID。
st_atime:最后访问时间。
st_mtime:最后修改时间。
st_ctime:最后更改(状态修改)时间。
可以使用这些成员来获取有关文件的详细信息。

以下是一个使用 stat 函数获取文件信息的简单示例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <time.h>

int main(void)
{
    const char *path = "1.txt";
    struct stat fileStat;

    if (stat(path, &fileStat) == -1) 
    {
        perror("stat");
        return 1;
    }

    printf("File Size: %lld bytes\n", fileStat.st_size);
    printf("File Permissions: %o\n", fileStat.st_mode & 0777);
    printf("File Owner UID: %d\n", fileStat.st_uid);
    printf("File Owner GID: %d\n", fileStat.st_gid);
    printf("Last Access Time: %s", ctime(&fileStat.st_atime));
    printf("Last Modification Time: %s", ctime(&fileStat.st_mtime));
    printf("Last Status Change Time: %s", ctime(&fileStat.st_ctime));

    return 0;
}


运行结果:
在这里插入图片描述

总结

本篇文章就讲解到这里,下篇文章我们继续讲解文件操作的内容。

更多推荐

中国游戏「二十年」:崛起、爆发与新机遇

【潮汐商业评论/文】“今年新上线的游戏还真不少,《逆水寒》《白夜极光》《崩坏》《晶核》,感觉都挺好玩的。”刚结束一个项目,Judy准备在周末玩一玩游戏。事实上,“版号寒冬”已经快结束一年了,自游戏版号重新颁布以来,游戏行业便开始逐步进入"复苏周期"。数据显示,2023年上半年,中国游戏市场销售收入1442.63亿元,同

基于YOLOv8的目标跟踪——汽车跟踪和计数

目标跟踪针对的是视频处理,它是目标检测的更高级的应用。目标跟踪要解决的主要问题应该是能够正确识别不同帧之间的同一个目标,而不仅仅是同一类目标。例如,在某个连续的时间段内总是出现张三这个人,目标跟踪可以在这段时间内把张三这个人标记为同一个人,从而实现跟踪其轨迹的目的。YOLOv8不仅可以实现目标检测和目标分割,还可以实现

虚幻4学习笔记(11) 蓝图实现AI移动、AI树实现移动、看见后寻找玩家

虚幻4学习笔记蓝图实现AI移动导航网格体人物移动AI跟随样条线移动AI树实现移动看见后寻找玩家靠近玩家挥拳B站UP谌嘉诚课程:https://www.bilibili.com/video/BV164411Y732蓝图实现AI移动导航网格体添加导航网格体边界体积(AI可活动的区域)按P键可以显示/隐藏区域范围导航网格体边

dockerfile介绍与使用案例

1.概述dockerfile可以理解为一个制作镜像的脚本,但远没有脚本复杂。他根据某种格式自定义内容,就可以快速创建出需求的镜像。docker容器启动的时候在最上层挂载了一个可写层,比如说我在容器里面创建一个文件,这个文件是存放在可写层的,这时候容器要是销毁了,那么我们对容器的一些写入操作也就没了,我这个文件也会随着容

【c语言】指针和数组笔试题

1.指针和数组笔试题解析一维数组inta[]={1,2,3,4};printf("%d\n",sizeof(a));//a单独放在sizeof内表示求整个数组的字节-----16printf("%d\n",sizeof(a+0));//a不是单独放在sizeof内部,表明是首元素的地址,地址占4/8个字节,32位机器占

gRpc_go_dart-1.编写第一个服务

​通俗的讲下grpc简化掉所有复杂的实现,它要求服务端和客户端之间按照protobuf的规范进行数据交换,所以服务端和客户端都不用关心彼此的代码实现,只关心按照protobuf的形式提供数据为什么是go和dart技术栈,已经是google的形状了同时,go客户端和Flutter间本身通过http协议不好交接数据,用gr

Seata1.5.2解决分布式事务问题

分布式事务–Seata​前面了解到一些分布式事务的解决方案,业内也涌现出不少解决分布式事务的优秀框架,如Atomikos、Seata等,本章来了解使用下Seata。​Seata的前身是Fescar,而后改名Seata,简单可扩展的自治分布式事务框架。Seata为用户提供了AT、TCC、SAGA和XA事务模式(默认使用A

【学习笔记】各类基于决策单调性的dp优化

文章目录对于决策单调性的一般解释关于决策单调性的证明四边形不等式一维dp区间dp一种二维dp一些满足四边形不等式的函数类与图形相结合决策单调性的常见优化手段二分队列二分栈分治类莫队做法SMAWKWQS二分+WQS多解情况满足四边形不等式的序列划分问题的答案凸性以及WQS二分的方案构造WQS外层二分时的边界Tips:斜率

容器【容器介绍、Set接口介绍、 HashSet容器的使用、TreeSet容器的使用】(三)-全面详解(学习总结---从入门到深化)

目录LinkedList容器介绍Set接口介绍HashSet容器的使用通过HashSet存储自定义对象TreeSet容器的使用LinkedList容器介绍LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一

SOLIDWORKS PDM—数据库的备份计划

SOLIDWORKS产品数据管理(PDM)解决方案可帮助您控制设计数据,并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用SOLIDWORKSPDMProfessional,您的团队能够:1.安全地存储和索引设计数据以实现快速检索;2.打消关于版本控制和数据丢失的顾虑;3.与多个地点的组织内外部的人员就设计进

Docker+jenkinsPipeline运行实现python自动化测试(超详细)

一、实现思路在Linux服务器安装docker创建jenkins容器jenkins中创建pipeline项目根据自动化项目依赖包构建python镜像(构建自动化python环境)运行新的python容器,执行jenkins从仓库中拉下来的自动化项目执行完成之后删除容器二、环境准备Linux服务器一台(我的是CentOS

热文推荐