首页 > 系统相关 >Linux文件编程(lseek函数和stat函数)

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

时间:2023-11-09 10:31:30浏览次数:42  
标签:lseek stat 函数 文件 st include

(文章目录)


前言

本篇文章来讲解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;
}


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

总结

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

标签:lseek,stat,函数,文件,st,include
From: https://blog.51cto.com/u_16153875/8273231

相关文章

  • 函数-数据合并
    concat和mergeconcat主要用于将数据沿着指定轴连接,不涉及键的匹配。merge主要用于基于键的匹配来合并数据,用于连接不同数据集的相关数据。 ......
  • 【misc】[HNCTF 2022 Week1]calc_jail_beginner_level2.5(JAIL) --沙盒逃逸,breakpoint
    查看附件内容这道题过滤挺多重要的函数,比如exec,input,eval,还对长度做了限制,这里了尝试了help函数,但是最后一步!ls没通,接着考虑breakpoin函数:Python中内置了一个名为breakpoint()的函数,在Python3.7中引入,用于在调试模式下设置断点。使用breakpoint()函数会停止程序的执行,并在......
  • 【misc】[HNCTF 2022 Week1]calc_jail_beginner_level3(JAIL) --沙盒逃逸,help函数
    还是先看附件内容这里对字符串长度进行了进一步的限制,长度不能大于7,这里可以输入help(),help函数:help()函数是Python的一个内置函数,用于获取关于模块、函数、类、方法等的帮助信息。当你在交互式命令行中使用help()函数时,它会打开一个交互式帮助系统,让你能够浏览相关主题和......
  • linux的netstat命令简介
    环境centos7.9介绍netstat是一个网络工具,用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,以及系统上当前的网络连接状态。它可以帮助用户了解网络连接的详细信息,从而更好地诊断和解决网络问题。语法netstat[选项]常用选项-a:显示所有连接和监听端口。-n:以数字形式显示地......
  • 关于 ts 中回调函数参数加上泛型限制后传入联合类型为什么会报错?
    相关代码如下,在use函数中加入联合类型后就会告诉我number和string类型不兼容,求教应该怎样解决这个问题,换个写法的话我想要的是保留use的泛型declarefunctionuse<T>(data:T,cb:(arg:T)=>void):voiddeclarefunctioncb1(arg:string):voiddeclarefunctioncb2......
  • PowerShell 函数遇见 Newtonsoft.Json.JsonReaderException: The reader's MaxDepth o
    问题描述创建PowerShellAzureDurableFunction,执行大量的PowerShell脚本操作AzureResource,遇见了一个非常非常奇怪的问题:Function'Hello1(Activity)'failedwithanerror.Reason:Newtonsoft.Json.JsonReaderException:Thereader'sMaxDepthof64hasbeenexceeded.Pa......
  • 无涯教程-批处理 - Right String函数
    这用于从字符串末尾提取字符。RightString-示例@echooffsetstr=Thismessageneedschanged.echo%str%setstr=%str:~-8%echo%str%关于上述程序,需要注意的关键是,使用〜-"要提取的字符数"运算符来提取字符串的右边。上面的命令产生以下输出。Thismessagene......
  • 【Azure Durable Function】PowerShell Activity 函数遇见 Newtonsoft.Json.JsonReade
    问题描述创建PowerShellAzureDurableFunction,执行大量的PowerShell脚本操作AzureResource,遇见了一个非常非常奇怪的问题:Function'Hello1(Activity)'failedwithanerror.Reason:Newtonsoft.Json.JsonReaderException:Thereader'sMaxDepthof64hasbeenexceeded.......
  • 数值分析第四课——函数逼近
    范数(最小化)内积(正交化)正交函数族(降维)最小二乘法、最小二乘法拟合、最佳平方三角逼近傅里叶级数  频域分析欧拉公式DFT(离散傅里叶变换) 快速傅里叶变化。总之,利用函数逼近方法,就可以找到很多数据的规律,规律用函数表示,虽然不是完全预测规律,但是概率很大。用处就是将复杂函......
  • 无涯教程-批处理 - Replace a String函数
    要将子字符串替换为另一个字符串,请使用字符串替换功能。ReplaceaString-示例@echooffsetstr=Thismessageneedschanged.echo%str%setstr=%str:needs=has%echo%str%关于上述程序,需要注意的关键是,该示例通过语句%str:needs=has%用字符串"has"替换了"needs"......