一、文件IO与标准IO的核心区分
文件IO和标准IO在文件操作方式上存在显著差异,主要体现在设计目标、底层实现和使用场景上:
核心标识
文件IO使用文件描述符(int类型,如0/1/2对应标准输入/输出/错误),标准IO使用文件流指针(FILE*类型)。
缓存机制
文件IO直接与内核交互,无缓存;标准IO在用户态提供缓存,减少系统调用次数。
底层实现
文件IO基于操作系统内核的系统调用(如open/read/write),标准IO封装文件IO的C库函数(如fopen/fread/fwrite)。
跨平台性
文件IO依赖操作系统(如Linux与Windows API不兼容),标准IO遵循C标准(如ANSI C),具有跨平台性。
适用场景
文件IO适用于设备文件(如串口、网卡)或实时性要求高的场景;标准IO适合普通磁盘文件操作,注重代码可移植性。
二、文件IO的核心操作(Linux系统)
打开文件:open函数
函数原型:
c
int open(const char *pathname, int flags, mode_t mode);
pathname:文件路径(如"./test.txt")。flags:打开模式(必选如O_RDONLY,可选如O_CREAT)。mode:文件权限(如0644,八进制格式)。
读取文件:read函数
函数原型:
c
ssize_t read(int fd, void *buf, size_t count);
fd:文件描述符。buf:数据缓冲区。count:期望读取的最大字节数。
写入文件:write函数
函数原型:
c
ssize_t write(int fd, const void *buf, size_t count);
fd:文件描述符。buf:待写入数据缓冲区。count:待写入数据字节数。
关闭文件:close函数
函数原型:
c
int close(int fd);
- 必须显式调用以避免文件描述符泄漏。
三、目录操作扩展
打开目录:opendir函数
函数原型:
c
DIR *opendir(const char *name);
- 返回目录流指针
DIR*。
读取目录:readdir函数
函数原型:
c
struct dirent *readdir(DIR *dirp);
- 返回
struct dirent结构体,包含文件名d_name等信息。
关闭目录:closedir函数
函数原型:
c
int closedir(DIR *dirp);
- 释放目录流资源。
四、Makefile工程编译工具
基本规则
makefile
目标:依赖文件
<TAB>编译命令
- 目标:如可执行文件
a.out。 - 依赖文件:如
.c源文件。 - 命令:如
gcc编译指令。
常用变量
$^:所有依赖文件。$@:目标文件。$<:第一个依赖文件。
示例
makefile
SRC = main.c func.c
APP = a.out
FLAG = -g -Wall
$(APP): $(SRC)
gcc $^ -o $@ $(FLAG)
clean:
rm -f $(APP)