网站首页 > 教程文章 正文
一句话理解 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 是锁上宝箱的动作,忘记锁门(关闭文件)可能导致宝物丢失!
- 上一篇: 聊一聊java程序中的换行符,你用对了吗
- 下一篇: Python实用案例之实时日志关键词监控系统
猜你喜欢
- 2025-03-11 CMake个人理解和使用
- 2025-03-11 编程语言中的“奇葩”:无代码语言Folders
- 2025-03-11 C语言 - 缓冲区溢出深度剖析与防御指南
- 2025-03-11 精彩3000字!给讲得明明白白:配置 logback
- 2025-03-11 cr是什么意思?
- 2025-03-11 不坑盒子2024.1218更新了,模板库上线、添加拼音、一键翻译……
- 2025-03-11 深度整合:解锁DeepSeek与Word的无限可能!
- 2025-03-11 linux 和 windows文件格式互相转换
- 2025-03-11 红帽RHEL8.0学习笔记
- 2025-03-11 nhttpd 从目录穿越到远程代码执行漏洞分析(CVE-2019-16278)
- 最近发表
-
- 绝区零:公测必看!300菲林兑换码、萌新补给一览!切勿踩坑!
- 事半功倍 轻松制作可交互移动原型
- LOL英雄联盟美服注册教材 教你玩转美服
- 「正点原子Linux连载」第五十八章Linux INPUT子系统实验(一)
- 如何轻松薅Cursor羊毛:用免手机号邮箱快速注册
- C/C++基础语法复习(一):C++与C语言的区别,主要有这些
- 永久免费的高配容器Clawcloud,超爽体验!
- Spaceship低价注册域名 | 每年5元不到 | XYZ域名 | 托管cloudflare
- 云杉网络DeepFlow基于Free5GC的方案示例
- alma8飞速搭建zabbix6、微信报警、windows、linux、交换机监控
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)