Linux 软件编程:文件IO、目录IO、时间函数
一、文件 IO
(一)基本概念
- 核心特性:文件 IO 是无缓存的 IO 操作,属于系统调用,直接与内核交互,适合通信、硬件设备操作等场景
- 与标准 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
),仅flags
含O_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 |
---|---|
r | O_RDONLY |
r+ | O_RDWR |
w | O_WRONLY、O_CREAT、O_TRUNC, 0664 |
w+ | O_RDWR、O_CREAT、O_TRUNC, 0664 |
a | O_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);
- 功能:删除目录文件(需确保目录为空)
三、时间函数
(一)时间类型
time_t
类型:表示从 1970-1-1 00:00:00 到当前的秒数,适用于时间计算逻辑struct tm
类型:包含具体年月日时分秒等信息,用于时间细节处理- 字符串类型(
char *
):由时间信息拼接的可读性字符串
(二)核心函数接口
1. 获取time_t
时间:time
- 原型:
time_t time(time_t *tloc);
- 功能:返回 1970-1-1 到当前的秒数
- 参数:
tloc
为存放秒数的空间首地址(可传 NULL,直接通过返回值获取) - 返回值:成功返回秒数,失败返回 - 1
2. time_t
转struct tm
:localtime
- 原型:
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_t
:mktime
- 原型:
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_t
;time_t
→(ctime
)→ 字符串时间