一、标准IO函数接口(库函数)
| 函数名 | 功能 | 参数 | 返回值 | 特点/注意事项 |
|---|---|---|---|---|
| fopen | 打开文件 | pathname:路径 mode:模式(r/r+/w/w+/a/a+) |
FILE*指针 失败返回NULL | 建立文件流,有缓存 |
| fclose | 关闭文件 | stream:文件流指针 |
成功0,失败EOF | 刷新缓存区并释放资源 |
| fputc | 写入字符 | c:字符ASCII码 stream:文件流指针 |
成功返回c,失败EOF | 单字符操作 |
| fgetc | 读取字符 | stream:文件流指针 |
成功返回字符,失败/EOF返回EOF | 单字符操作 |
| fputs | 写入字符串 | s:字符串首地址 stream:文件流指针 |
成功非负数,失败EOF | 不自动加\n |
| fgets | 读取字符串 | s:缓冲区 size:最大长度 stream:文件流指针 |
成功返回s,失败/EOF返回NULL | 保留\n,需手动去除 |
| fprintf | 格式化写入 | stream:文件流指针 format:格式字符串 |
成功返回字符数,失败负数 | 类似printf,指定流 |
| fscanf | 格式化读取 | stream:文件流指针 format:格式字符串 |
成功返回匹配项数,失败/EOF返回EOF | 类似scanf,指定流 |
| fwrite | 二进制写入 | ptr:数据地址 size:对象大小 nmemh:对象个数 stream:文件流指针 |
成功返回写入对象数,失败0 | 适合二进制文件 |
| fread | 二进制读取 | ptr:缓冲区 size:对象大小 nmemh:对象个数 stream:文件流指针 |
成功返回读取对象数,失败/EOF返回0 | 适合二进制文件 |
| fseek | 移动文件指针 | stream:文件流指针 offset:偏移量 whence:起始位置 |
成功0,失败-1 | SEEK_SET/CUR/END |
| ftell | 获取当前位置 | stream:文件流指针 |
成功返回偏移量,失败-1 | 返回当前位置 |
| rewind | 重置到开头 | stream:文件流指针 |
无返回值 | 相当于fseek(stream,0,SEEK_SET) |
| feof | 检查文件结尾 | stream:文件流指针 |
非0表示到达结尾 | 检测文件结束标志 |
| ferror | 检查错误 | stream:文件流指针 |
非0表示错误 | 检测错误标志 |
二、文件IO函数接口(系统调用)
| 函数名 | 功能 | 参数 | 返回值 | 特点/注意事项 |
|---|---|---|---|---|
| open | 打开文件 | pathname:路径 flags:标志位 mode:权限(可选) |
成功返回文件描述符,失败-1 | 无缓存,直接系统调用 |
| read | 读取文件 | fd:文件描述符 buf:缓冲区 count:字节数 |
成功返回读取字节数,0表示EOF,失败-1 | 无缓存,直接读取 |
| write | 写入文件 | fd:文件描述符 buf:数据地址 count:字节数 |
成功返回写入字节数,失败-1 | 无缓存,直接写入 |
| lseek | 移动文件指针 | fd:文件描述符 offset:偏移量 whence:起始位置 |
成功返回偏移量,失败-1 | 类似fseek |
| close | 关闭文件 | fd:文件描述符 |
成功0,失败-1 | 释放文件描述符 |
flags参数说明:
-
O_RDONLY:只读 -
O_WRONLY:只写 -
O_RDWR:读写 -
O_CREAT:不存在则创建 -
O_TRUNC:存在则清空 -
O_APPEND:追加模式 -
O_EXCL:与O_CREAT连用,文件存在则报错
三、目录IO函数接口
| 函数名 | 功能 | 参数 | 返回值 | 特点/注意事项 |
|---|---|---|---|---|
| opendir | 打开目录 | name:目录路径 |
DIR*指针,失败NULL | 获取目录流指针 |
| readdir | 读取目录项 | dirp:目录流指针 |
dirent*指针,失败/EOF返回NULL | 返回目录项信息 |
| closedir | 关闭目录 | dirp:目录流指针 |
成功0,失败-1 | 关闭目录流 |
| mkdir | 创建目录 | pathname:路径 mode:权限 |
成功0,失败-1 | 创建目录文件 |
| rmdir | 删除空目录 | pathname:路径 |
成功0,失败-1 | 只能删除空目录 |
| chdir | 切换目录 | path:目标路径 |
成功0,失败-1 | 改变当前工作目录 |
| getcwd | 获取当前目录 | buf:缓冲区 size:缓冲区大小 |
成功返回buf,失败NULL | 获取绝对路径 |
dirent结构体:
c
struct dirent {
ino_t d_ino; // inode号
off_t d_off; // 偏移量
unsigned short d_reclen; // 记录长度
unsigned char d_type; // 文件类型
char d_name[256]; // 文件名
};
四、时间相关接口
| 函数名 | 功能 | 参数 | 返回值 | 特点/注意事项 |
|---|---|---|---|---|
| time | 获取时间戳 | tloc:存储地址(可为NULL) |
成功返回时间戳,失败-1 | 从1970-1-1开始的秒数 |
| localtime | 转为本地时间 | timep:时间戳指针 |
返回tm结构体指针 | 包含时区信息 |
| mktime | 转为时间戳 | tm:tm结构体指针 |
成功返回时间戳,失败-1 | 反向转换 |
tm结构体:
c
struct tm {
int tm_sec; // 秒[0-59]
int tm_min; // 分[0-59]
int tm_hour; // 时[0-23]
int tm_mday; // 日[1-31]
int tm_mon; // 月[0-11]
int tm_year; // 年(从1900起)
int tm_wday; // 星期[0-6]
int tm_yday; // 年中日[0-365]
int tm_isdst; // 夏令时标志
};
五、IO接口对比总结
| 特性 | 标准IO | 文件IO | 目录IO |
|---|---|---|---|
| 头文件 | <stdio.h> |
<fcntl.h>, <unistd.h> |
<dirent.h>, <sys/stat.h> |
| 缓存 | 有缓存(全/行/无) | 无缓存 | 无缓存 |
| 接口类型 | 库函数 | 系统调用 | 库函数/系统调用 |
| 操作对象 | 文件流(FILE*) | 文件描述符(int) | 目录流(DIR*) |
| 适用场景 | 普通文件 | 设备文件、通信文件 | 目录文件 |
| 性能 | 较高(有缓存) | 较低(无缓存) | 中等 |
| 移植性 | 高(ANSI C标准) | 较低(POSIX标准) | 较低(POSIX标准) |
| 使用难度 | 较低 | 较高 | 中等 |
六、常用关系对应表
| 标准IO函数 | 文件IO对应 | 说明 |
|---|---|---|
fopen |
open |
打开文件 |
fclose |
close |
关闭文件 |
fread/fgetc |
read |
读取数据 |
fwrite/fputc |
write |
写入数据 |
fseek |
lseek |
移动指针 |
ftell |
lseek(fd,0,SEEK_CUR) |
获取位置 |
rewind |
lseek(fd,0,SEEK_SET) |
重置到开头 |
stdin |
文件描述符0 | 标准输入 |
stdout |
文件描述符1 | 标准输出 |
stderr |
文件描述符2 | 标准错误 |