当前位置: 首页 > 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.lryc.cn/news/619263.html

相关文章:

  • 适配安卓15(对应的sdk是35)
  • RxJava 在 Android 中的深入解析:使用、原理与最佳实践
  • 大牌点餐接口api对接全流程
  • 《吃透 C++ 类和对象(中):构造函数与析构函数的核心逻辑》
  • Ubuntu22.04轻松安装Qt与OpenCV库
  • 药房智能盘库系统的Python编程分析与实现—基于计算机视觉与时间序列预测的智能库存管理方案
  • 基于大数据spark的医用消耗选品采集数据可视化分析系统【Hadoop、spark、python】
  • 分段锁和限流的间接实现
  • 通信中间件 Fast DDS(一) :编译、安装和测试
  • 机器学习—— TF-IDF文本特征提取评估权重 + Jieba 库进行分词(以《红楼梦》为例)
  • CMake进阶: 使用FetchContent方法基于gTest的C++单元测试
  • LINUX812 shell脚本:if else,for 判断素数,创建用户
  • 【GESP】C++一级知识点之【集成开发环境】
  • TF-IDF:信息检索与文本挖掘的统计权重基石
  • [SC]如何使用sc_semaphore实现对共享资源的访问控制
  • 初识神经网络04——构建神经网络2
  • 【从零开始java学习|第四篇】IntelliJ IDEA 入门指南
  • Redis序列化配置类
  • uni-app实战教程 从0到1开发 画图软件 (学会画图)
  • 基于STC8单片机的RTC时钟实现:从原理到实践
  • 聚合搜索中的设计模式
  • 数据结构:中缀到后缀的转换(Infix to Postfix Conversion)
  • 开发避坑指南(23):Tomcat高版本URL特殊字符限制问题解决方案(RFC 7230 RFC 3986)
  • 一键设置 NTP 时区的脚本(亲测,适用于部署 K8S 的前置环境)
  • 数据结构:图
  • 终端安全与网络威胁防护笔记
  • Web 服务详解:HTTP 与 HTTPS 配置
  • 谷歌 Web Guide 如何重塑搜索排名及其 SEO 影响
  • AR眼镜新赛道:光波导与MicroOLED如何解决眩晕难题?
  • -bash: ll: 未找到命令