网站首页 > 文章精选 正文
一句话理解 fopen
「用特定的‘钥匙’(模式)打开文件大门,如果钥匙匹配成功,就能读写文件;否则大门紧闭!」
函数原型
#include // 必须包含头文件
FILE *fopen(const char *filename, const char *mode);
入口参数
参数 | 类型 | 比喻解释 |
filename | const char* | 文件路径(如 "secret.txt") |
mode | const char* | 打开模式(钥匙类型) |
返回参数
返回值 | 含义 |
FILE* 指针 | 文件大门的「钥匙」,后续操作都靠它 |
NULL | 钥匙配错,开门失败(文件不存在/权限不足) |
钥匙类型大全(模式详解)
模式符 | 钥匙功能 | 文件不存在时的行为 |
"r" | 只读模式(Read) | 开门失败 |
"w" | 只写模式(Write),清空文件内容 | 创建新文件 |
"a" | 追加模式(Append),在文件末尾追加内容 | 创建新文件 |
"r+" | 读写模式(可读可写),文件必须存在 | 开门失败 |
"w+" | 读写模式,清空文件内容 | 创建新文件 |
"a+" | 读写模式,但写操作只能在文件末尾追加 | 创建新文件 |
附加选项 | 可组合使用(如 "rb") | |
b | 二进制模式(Windows特有,解决换行符问题) |
代码实例1:读取文件内容
#include
int main() {
// 尝试用 "r" 钥匙打开文件
FILE *file = fopen("poem.txt", "r");
if (file == NULL) {
printf(" 开门失败!文件不存在或无权访问\n");
return 1;
}
// 逐行读取并打印
char line[256];
while (fgets(line, sizeof(line), file) != NULL) {
printf("%s", line);
}
fclose(file); // 记得关门!
return 0;
}
代码实例2:写入新文件
#include
int main() {
// 用 "w" 钥匙创建/覆盖文件
FILE *file = fopen("diary.log", "w");
if (file == NULL) {
printf(" 无法创建日记文件\n");
return 1;
}
// 写入内容
fprintf(file, "2023-10-05 天气晴\n");
fprintf(file, "今天学会了 fopen 函数!\n");
fclose(file); // 保存并关闭
return 0;
}
代码实例3:追加内容 + 二进制模式
#include
int main() {
// 用 "ab" 钥匙以二进制追加模式打开
FILE *file = fopen("data.bin", "ab");
if (file == NULL) {
perror(" 错误原因"); // 打印系统错误信息
return 1;
}
// 写入二进制数据(例如一个整数)
int new_data = 0x12345678;
fwrite(&new_data, sizeof(int), 1, file);
fclose(file);
return 0;
}
技术细节剖析
1.文件路径的写法
fopen("C:\\Users\\test.txt", "r"); // Windows 路径需要双反斜杠
fopen("/home/user/data.csv", "r"); // Linux/macOS 用正斜杠
2.模式符组合的奥秘
组合符 | 等效操作 |
"r+b" | 可读可写 + 二进制模式 |
"wb+" | 清空文件 + 可读可写 + 二进制模式 |
3.错误处理最佳实践
- 使用 perror 直接输出错误原因:
FILE *file = fopen("config.ini", "r");
if (file == NULL) {
perror(" fopen 失败"); // 输出: fopen 失败: No such file or directory
exit(1);
}
注意事项
- 资源泄漏陷阱:
FILE *file = fopen("temp.txt", "w");
fprintf(file, "Hello"); // 忘记 fclose → 文件可能未保存!
- 模式符的隐藏特性:
- "w" 和 "w+" 会清空文件内容,误用可能导致数据丢失。
- "a" 模式下无法修改文件中间内容,写操作永远在末尾。
创新用法:文件锁 + 临时文件
// 创建临时文件(仅当前进程可见)
FILE *tmp = fopen("temp_XXXXXX", "w+"); // 实际应使用 mkstemp
// 写入敏感数据...
fclose(tmp);
对比 open(Linux系统调用)
特性 | fopen | open |
抽象层级 | 高级文件流 | 低级文件描述符 |
跨平台性 | 所有C标准环境支持 | 仅类Unix系统 |
缓冲区管理 | 自动缓冲(可设置) | 无缓冲,需手动管理 |
总结
- 核心功能:打开文件并获取操作句柄。
- 适用场景:配置文件读取、日志记录、数据持久化存储。
- 类比记忆:fopen 是打开文件宝箱的钥匙,fclose 是锁上宝箱的动作,忘记锁门(关闭文件)可能导致宝物丢失!
猜你喜欢
- 2025-03-26 PHP常用类 – 缓存类 cache(php几大缓存技术)
- 2025-03-26 C语言strerror函数详解:"错误翻译官"
- 2025-03-26 C语言 ftell 与 fseek 的深度结合应用
- 2025-03-26 C语言putc函数详解:“字符快递员”
- 2025-03-26 C语言srand函数详解:随机数的「播种者」
- 2025-03-26 C语言wctomb函数详解:宽字符到多字节字符的「翻译官」
- 2025-03-26 Linux学习笔记-标准IO库(linux io操作)
- 2025-03-26 小白也能做的物联网(ESP8266)制作遥控船联网远程控制,超详细
- 2025-03-26 C语言remove函数详解:“文件粉碎机”
- 2025-03-26 初学者指南——文件包含(LFI / RFI)
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)