学习笔记——文件I/O

文件I/O和目录操作

一、系统调用与C库函数

1. 系统调用 (File I/O)

  • 操作系统提供的底层接口

  • 直接访问内核功能

  • 功能强大,但平台相关

  • 对设备文件操作更高效

2. C库函数 (Standard I/O)

  • C标准库提供的高级接口

  • 跨平台,通用性好

  • 带缓冲机制,适合非设备文件

  • 底层调用系统调用函数

二、文件操作对比

特性 标准I/O 文件I/O
接口类型 C库函数 系统调用
文件标识 FILE* 文件流指针 int 文件描述符
缓冲机制 带缓冲区 无缓冲区
移植性 高(跨平台) 低(平台相关)
适合场景 普通文件 设备文件

三、文件I/O操作步骤

1. 打开文件 - open()

复制代码
#include <fcntl.h>
#include <unistd.h>

int open(const char *pathname, int flags, int mode);

功能: 获得一个文件描述符

参数:

  • pathname: 文件名

  • flags:

    • O_RDONLY: 只读

    • O_WRONLY: 只写

    • O_RDWR: 读写

    • O_CREAT: 创建文件

    • O_TRUNC: 清空文件内容

    • O_APPEND: 追加模式

  • mode: 文件权限(创建文件时需要)

返回值:

  • 成功: 返回文件描述符(非负整数)

  • 失败: 返回-1

2. 读取文件 - read()

复制代码
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

功能: 从文件读取数据

参数:

  • fd: 文件描述符

  • buf: 接收数据的缓冲区指针

  • count: 最大读取字节数

返回值:

  • >0: 实际读取的字节数

  • =0: 文件结束

  • <0: 错误

3. 写入文件 - write()

复制代码
#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

功能: 向文件写入数据

参数:

  • fd: 文件描述符

  • buf: 要写入的数据指针

  • count: 写入数据的长度

返回值:

  • >0: 实际写入的字节数

  • =0: 无数据写入(某些设备)

  • <0: 错误

4. 关闭文件 - close()

复制代码
#include <unistd.h>

int close(int fd);

功能: 关闭文件描述符

参数:

  • fd: 文件描述符

返回值:

  • 成功: 返回0

  • 失败: 返回-1

四、目录操作步骤

1. 打开目录 - opendir()

复制代码
#include <dirent.h>
#include <sys/types.h>

DIR *opendir(const char *name);

功能: 打开目录,获得目录流指针

参数:

  • name: 目录名

返回值:

  • 成功: 返回目录流指针

  • 失败: 返回NULL

2. 读取目录 - readdir()

复制代码
#include <dirent.h>

struct dirent *readdir(DIR *dirp);

功能: 读取目录中的文件信息

参数:

  • dirp: 目录流指针

返回值:

  • 成功: 返回文件信息结构体指针

  • 失败或结束: 返回NULL

dirent结构体:

复制代码
struct dirent {
    ino_t d_ino;            // 索引节点号
    off_t d_off;            // 目录文件中的偏移
    unsigned short d_reclen; // 记录长度
    unsigned char d_type;   // 文件类型
    char d_name[256];       // 文件名
};

文件类型常量:

  • DT_DIR: 目录文件

  • DT_REG: 普通文件

  • DT_LNK: 链接文件

  • DT_CHR: 字符设备

  • DT_BLK: 块设备

  • DT_FIFO: 管道

  • DT_SOCK: 套接字

3. 关闭目录 - closedir()

复制代码
#include <dirent.h>

int closedir(DIR *dirp);

功能: 关闭目录流

参数:

  • dirp: 目录流指针

返回值:

  • 成功: 返回0

  • 失败: 返回-1

五、重要概念总结

1. 文件描述符

  • 非负整数,表示打开的文件

  • 0: 标准输入(stdin)

  • 1: 标准输出(stdout)

  • 2: 标准错误(stderr)

  • 其他: 用户打开的文件

2. 缓冲机制

  • 标准I/O: 带缓冲区,减少系统调用次数

  • 文件I/O: 无缓冲区,直接读写

3. 错误处理

  • 所有系统调用失败返回-1

  • 使用perror()打印错误信息

  • 使用errno获取错误码

4. 文件权限

创建文件时需要指定权限,常用权限:

  • 0644: 用户读写,组和其他只读

  • 0755: 用户读写执行,组和其他读执行

六、使用建议

  1. 普通文件操作: 优先使用标准I/O(更高效)

  2. 设备文件操作: 使用文件I/O(更直接)

  3. 错误检查: 每次调用后都要检查返回值

  4. 资源释放: 使用完后及时关闭文件/目录描述符

  5. 路径处理: 使用相对路径或绝对路径,注意权限

相关推荐
烬羽4 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
tntxia17 小时前
linux curl命令详解_curl详解
linux
扛枪的书生19 小时前
Linux 网络管理器用法速查
linux
先吃饱再说20 小时前
判断回文字符串,从一行代码到双指针优化
算法
顺风尿一寸1 天前
Java Socket 内核之旅:从 SocketChannel.read() 到 tcp_recvmsg 与 epoll 的完整调用链路
linux
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
jiayou641 天前
KingbaseES 表级与列级加密完全指南
数据库·后端
AI小老六1 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程