news 2026/6/23 23:19:08

学习笔记——文件I/O

作者头像

张小明

前端开发工程师

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 10:58:05

应用——文件I/O操作代码

文件I/O操作代码分析 一、基础文件操作 1. 打开文件 - 01open.c #include <fcntl.h> #include <stdio.h>int main(int argc, char **argv) {int fd open("1.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);if (-1 fd) {fprintf(stderr, "open err…

作者头像 李华
网站建设 2026/6/23 23:18:41

SpringBoot3+Vue3新闻动态网站

基于 Spring Boot 3.1.5 MyBatis-Plus 3.5.8 Vue3 MySQL Element-Plus 开发的校园新闻动态网站系统。技术栈后端Spring Boot 3.1.5MyBatis-Plus 3.5.8MySQLJWT 认证Hutool 工具类前端Vue 3Vue Router 4PiniaElement PlusEChartsWangEditor 富文本编辑器Axios功能模块用户角…

作者头像 李华
网站建设 2026/6/23 23:18:57

销售年终汇报再也不难写:AI自动把你的业绩转成完整PPT

引言 每到年终&#xff0c;销售们撰写年终汇报就成了一大难题。不仅要详细梳理全年业绩&#xff0c;还要将这些内容精心整理成一份逻辑清晰、美观专业的 PPT。手动撰写和制作 PPT 不仅耗时费力&#xff0c;还容易出现内容结构混乱、排版不美观等问题&#xff0c;让本就忙碌的销…

作者头像 李华
网站建设 2026/6/22 16:15:05

高性能ESAM芯片LKT4305GM

ESAM芯片是一种嵌入式安全控制模块&#xff0c;主要用于数据加密存储、身份认证和终端安全防护。其核心功能包括支持多种加密算法、通信协议和双向认证机制&#xff0c;广泛应用于智能表计、金融设备等领域。随着云计算、大数据等技术的广泛应用&#xff0c;数据中心对高速、多…

作者头像 李华
网站建设 2026/6/23 19:08:50

销售年终总结PPT这样做最快:AI一键生成,从业绩到亮点全自动呈现

引言 每到年末&#xff0c;销售们都要撰写年终总结PPT。然而&#xff0c;整理业绩数据、突出工作亮点、规划未来方向&#xff0c;这些内容繁琐且耗费时间。手动制作PPT不仅要花费大量时间排版&#xff0c;还可能因为缺乏设计经验&#xff0c;导致PPT结构混乱、美观度不足。如何…

作者头像 李华
网站建设 2026/6/23 0:17:28

销售工作太杂做不出PPT?AI自动帮你生成逻辑清晰的年终总结

引言 销售工作涉及客户跟进、业绩统计、市场分析等众多繁杂事务。到了年终&#xff0c;要把这些琐碎的工作整理成一份逻辑清晰的年终总结PPT&#xff0c;让不少销售人头疼不已。自己手动整理内容&#xff0c;不仅费时费力&#xff0c;还容易出现结构混乱的问题&#xff0c;难以…

作者头像 李华