当前位置: 首页 > news >正文

Linux 软件编程:文件IO、目录IO、时间函数

一、文件 IO

(一)基本概念

  1. 核心特性:文件 IO 是无缓存的 IO 操作,属于系统调用,直接与内核交互,适合通信、硬件设备操作等场景
  2. 与标准 IO 的区别
    • 标准 IO 是库函数(对系统调用的封装,可跨平台),文件 IO 是内核中的系统调用(仅能在 Linux 系统中使用)
    • 标准 IO 有缓存(效率高、实时性差),文件 IO 无缓存(实时性强)

(二)核心函数接口

1. 文件打开:open
  • 原型
    int open(const char *pathname, int flags);
    int open(const char *pathname, int flags, mode_t mode);
    
  • 功能:打开文件并获得操作文件的文件描述符
  • 参数
    • pathname:要打开的文件路径
    • flags:打开标志(必须包含O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)三者之一);可选标志包括O_CREAT(文件不存在则创建)、O_TRUNC(文件存在则清 0)、O_APPEND(追加模式)、O_EXCL(文件存在则报错)
    • mode:创建文件时的权限(如0664),仅flagsO_CREAT时有效
  • 返回值:成功返回新文件描述符(非负整数),失败返回 - 1
  • 特殊文件描述符:标准输入(0)、标准输出(1)、标准错误(2)
  • 文件描述符特点:非负整数,取尚未被占用的最小非负整数,存在上限(达上限后打开文件会报错)
2. 文件关闭:close
  • 原型int close(int fd);
  • 功能:关闭文件描述符
  • 参数fd为要关闭的文件描述符
  • 返回值:成功返回 0,失败返回 - 1
3. 文件读写
  • write(写入)

    • 原型ssize_t write(int fd, const void *buf, size_t count);
    • 功能:向文件描述符fd写入buf指向的count个字节数据
    • 返回值:成功返回实际写入的字节数,失败返回 - 1
  • read(读取)

    • 原型ssize_t read(int fd, void *buf, size_t count);
    • 功能:从文件描述符fd读取count个字节到buf指向的空间
    • 返回值:成功返回实际读到的字节数,读到文件末尾返回 0,失败返回 - 1
4. 偏移量定位:lseek
  • 原型off_t lseek(int fd, off_t offset, int whence);
  • 功能:重新定位文件描述符的偏移量
  • 参数
    • offset:偏移量(正数向后偏移,负数向前偏移)
    • whence:基准位置(SEEK_SET(文件开头)、SEEK_CUR(当前位置)、SEEK_END(文件末尾))
  • 返回值:成功返回新偏移量,失败返回 - 1
5. 标准 IO 与文件 IO 转换
  • fileno:根据文件流指针获得对应文件描述符
  • fdopen:根据已打开的文件描述符获得对应文件流指针
6. 打开方式对应表
标准 IO文件 IO
rO_RDONLY
r+O_RDWR
wO_WRONLY、O_CREAT、O_TRUNC, 0664
w+O_RDWR、O_CREAT、O_TRUNC, 0664
aO_WRONLY、O_APPEND、O_CREAT, 0664
a+O_RDWR、O_APPEND、O_CREAT, 0664

二、目录 IO

(一)操作流程

打开目录文件 → 读取目录项 → 关闭目录文件

(二)核心函数接口

1. 打开目录:opendir
  • 原型DIR *opendir(const char *name);
  • 功能:打开目录流并返回目录流指针
  • 参数name为目录文件的路径
  • 返回值:成功返回目录流指针,失败返回 NULL
2. 关闭目录:closedir
  • 原型int closedir(DIR *dirp);
  • 功能:关闭目录流指针
  • 参数dirp为要关闭的目录流指针
  • 返回值:成功返回 0,失败返回 - 1
3. 读取目录项:readdir
  • 原型struct dirent *readdir(DIR *dirp);
  • 功能:读取并返回下一个目录项的信息
  • 参数dirp为目录流指针
  • 返回值:成功返回包含目录项信息的结构体指针,失败或读到末尾返回 NULL
  • 结构体struct dirent

 关键成员

  • d_ino:inode 编号(通过 inode 定位文件磁盘位置)。
  • d_type:文件类型。
  • d_name:文件名(字符串)。
4. 获取当前工作目录:getcwd
  • 原型char *getcwd(char *buf, size_t size);
  • 功能:获得当前工作目录的绝对路径
  • 参数buf为存放路径的空间首地址,size为空间最大容量
  • 返回值:成功返回路径空间首地址,失败返回 NULL
5. 切换工作目录:chdir
  • 原型int chdir(const char *path);
  • 功能:切换当前工作路径
  • 参数path为目标路径
  • 返回值:成功返回 0,失败返回 - 1
6. 创建目录:mkdir
  • 原型int mkdir(const char *pathname, mode_t mode);
  • 功能:创建目录文件
  • 目录权限说明
    • r:允许查看目录下文件名
    • w:允许在目录下新建文件
    • x:允许进入目录
7. 删除目录:rmdir
  • 原型int rmdir(const char *pathname);
  • 功能:删除目录文件(需确保目录为空)

三、时间函数

(一)时间类型

  1. time_t类型:表示从 1970-1-1 00:00:00 到当前的秒数,适用于时间计算逻辑
  2. struct tm类型:包含具体年月日时分秒等信息,用于时间细节处理
  3. 字符串类型(char *:由时间信息拼接的可读性字符串

(二)核心函数接口

1. 获取time_t时间:time
  • 原型time_t time(time_t *tloc);
  • 功能:返回 1970-1-1 到当前的秒数
  • 参数tloc为存放秒数的空间首地址(可传 NULL,直接通过返回值获取)
  • 返回值:成功返回秒数,失败返回 - 1
2. time_t struct tmlocaltime
  • 原型struct tm *localtime(const time_t *timep);
  • 功能:将time_t类型秒数转换为struct tm结构体时间(本地时间)
  • struct tm成员
    • tm_sec:秒(0-60)
    • tm_min:分(0-59)
    • tm_hour:时(0-23)
    • tm_mday:日(1-31)
    • tm_mon:月(0-11,0 代表 1 月)
    • tm_year:年(需加 1900 得到实际年份)
    • tm_wday:星期(0-6,0 代表周日
    • tm_yday:年内天数(0-365,1 月 1 日为 0)
    • tm_isdst:夏令时标志
  • 返回值:成功返回struct tm指针,失败返回 NULL
3. struct tm 转 time_tmktime
  • 原型time_t mktime(struct tm *tm);
  • 功能:将struct tm结构体时间转换为time_t类型秒数
  • 返回值:成功返回time_t时间,失败返回 - 1
  • 原型char *ctime(const time_t *timep);
  • 功能:将time_t类型时间转换为可读性字符串(如"Wed Jun 30 21:49:08 1993"
  • 返回值:成功返回字符串指针,失败返回 NULL

(三)时间转换关系

time_t ←(mktime)→ struct tm ←(localtime)→ time_ttime_t →(ctime)→ 字符串时间

http://www.dtcms.com/a/328706.html

相关文章:

  • GitHub分支保护介绍(Branch Protection)(git分支保护)(通过设置规则和权限来限制对特定分支的操作的功能)
  • 11.用反射为静态类的属性赋值 C#例子 WPF例子
  • K8S中,kubectl cordon、uncordon、drain、taint的区别
  • 计算机网络---用户数据报协议User Datagram Protocol(UDP)
  • 【Part 4 未来趋势与技术展望】第一节|技术上的抉择:三维实时渲染与VR全景视频的共生
  • vue--video使用动态src时,视频不更新
  • Java零基础笔记16(Java编程核心:存储读写数据方案—File文件操作、IO流、IO框架)
  • 利用生成式AI与大语言模型(LLM)革新自动化软件测试 —— 测试工程师必读深度解析
  • PythonDay25
  • Android实现Glide/Coil样式图/视频加载框架,Kotlin
  • 《C++进阶之继承多态》【final + 继承与友元 + 继承与静态成员 + 继承模型 + 继承和组合】
  • mapbox进阶,实现精灵图生成和拆分(小图任意大小,不固定),并简单使用
  • 选择排序专栏
  • Docker安装influxdb以及python基本操作
  • 传输层协议 TCP(1)
  • latex 中将新的一个section重新从1开始排序,而不是和前面的section继续排序
  • 更改webpack默认配置项
  • 第二十二天:指针与内存
  • 【C++详解】用红黑树封装模拟实现mymap、myset
  • 代码随想录刷题Day30
  • UnityWeb打包注意事项及与网页端通信
  • 初识c语言————排序方法
  • 【游戏开发记录】一款网游+修仙为背景的游戏
  • 美国英语 8 You‘re Going to Be Fine 早日康复
  • Dify 从入门到精通(第 32/100 篇):Dify 的日志分析与监控
  • 1688跨境寻源通API接入||跨境寻源通有哪些具体的功能和优势?
  • 反射的详解
  • CAP理论深度解析与工程实践指南
  • USB基础 -- USB2.0设备插入的过程
  • 陕西西安一家IPO四年亏损近25亿负债率攀升,控制权稳定性遭质疑