C语言:fopen模式比较
fopen 模式
属 性 |
r |
w |
a |
r+ |
w+ |
a+ |
文件必须已存在 |
Y |
N |
N |
Y |
N |
N |
文件内容将丢失 |
N |
Y |
N |
N |
Y |
N |
允许从流读取(fread) |
Y |
N |
N |
Y |
Y |
Y |
允许写入到流(fwrite) |
N |
Y |
Y |
Y |
Y |
Y |
从流的末尾写入 |
N |
N |
Y |
N |
N |
Y |
任意定位(fseek) |
Y |
Y |
Y |
Y |
Y |
N |
当操作的文件的文件是二进制文件的时候,流的模式可以指定符中添加字母b进行表示,b可以出现在+号的之前或之后 例如:rb,wb,a+b,ab+
参考:《C语言参考手册》 p284,p285
r+ ,w+,a+ 几种模式解析
虽然r+,w+两种模式都是可以进行进行读写操作,但是w+打开文件的时候会清除掉文件内容,因此当需要对文件内容进行随机访问和读写的时候,坚决的不能使用这种模式,以r+方式进行fwrite的时候只会覆盖掉文件的当前流位置之后的若干字节
想象一个场景:如果文件是一种小型数据库,每一笔记录都是一个等长数据块,因此对于数据的更新操作,就要支持随机访问,想要修改第3笔记录的某个字段值完全就可以算出偏移量((3-1) * 定长数据的长度)然后fseek过去,直接fwrite,如果是w+的方式打开,那么将丢失文件内容,此时的操作产生的影响:未知
a+模式从fopen模式表来看应该算是最强大的模式了,不过实际情况看起来是这个模式无法完成更新文件的作用,无论如何使用fseek进行定位,这个文件的流的起始位置始终在文件末尾,也就是说它无法替代r+,w+这两种模式
总结:如果要对文件进行读写的话,尽量以r+方式打开文件,w+实在是一种危险的打开方式,而对于a+的应用场景我想它则只能用于追加数据,最强大最安全的方式还是r+
#include <stdio.h>
FILE *fp = fopen(filename,"r+");
assert(fp != NULL);
//assert会报错,而w,a则不会
posted on 2012-03-14 22:59 codestyle 阅读(1287) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述