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

学习笔记——文件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. 路径处理: 使用相对路径或绝对路径,注意权限

http://www.cnnetsun.cn/news/2509.html

相关文章:

  • 应用——文件I/O操作代码
  • SpringBoot3+Vue3新闻动态网站
  • 销售年终汇报再也不难写:AI自动把你的业绩转成完整PPT
  • 高性能ESAM芯片LKT4305GM
  • 销售年终总结PPT这样做最快:AI一键生成,从业绩到亮点全自动呈现
  • 销售工作太杂做不出PPT?AI自动帮你生成逻辑清晰的年终总结
  • 指针,不多的记录
  • Pandas库和画图
  • 第三方库Numpy
  • 中年危局:当职场抛弃你,比你想象的更早——一场静悄悄的社会性“死亡“
  • 项目解决方案:某湖泊AI微光增强水域监控解决方案
  • 协作传感加密密钥更新最佳实践(20年安全专家亲授)
  • 资源利用率提升80%?:深度解析量子-经典混合分配新范式
  • 量子编程调试技术深度解析(90%开发者忽略的关键细节)
  • 从下单到签收缩短40%时间:揭秘头部企业物流网络调度模型
  • 2030年网络安全倒计时:边缘量子密钥存储部署为何必须现在启动?
  • 为什么90%的量子编程课程失败?:教育设计中的4大盲区必须避开
  • 结构电池性能预测误差深度解析(误差来源全曝光)
  • 为什么你的AI服务在云端总崩溃?揭开故障转移配置的3个致命盲区
  • 【金融交易量子加速的安全验证】:揭秘量子计算时代下金融系统安全的十大挑战与应对策略
  • 【智慧城市安全防线】:如何在3步内实现RBAC与ABAC融合管控
  • 错过等于落后十年:量子增强医疗影像的7大应用场景全面解析
  • 跨技术领域标准规范落地实践(从混乱到统一的架构进化)
  • 独家解密:全球仅3国掌握的6G AI协议兼容性核心技术
  • 量子-经典混合资源分配实战指南(20年专家亲授架构设计秘诀)
  • 量子程序调试难题如何破解?3步实现精准错误定位与修复
  • 【教育量子编程的课程设计】:9所顶尖学校验证有效的教学框架
  • 揭秘协作传感网络中的密钥更新机制:如何实现安全高效的实时加密?
  • 【大规模AI平台稳定性保障】:深度解析云原生环境下的故障检测与切换机制
  • 结构电池预测不准?3步精准定位误差来源并提升模型可靠性