当前位置: 首页 > news >正文

模拟实现:glibc_1.0-文件操作函数fopen fclose fwrite fflush实现。

@bit::Shadow
✧(≖ ◡ ≖✿

目录

文件与缓冲区的关系

模拟实现

文件属性

文件库函数

fopen()

实现:

文件打开会不会发生缓冲区内存在内容?而需要缓冲区刷新?

fwrite()

fflush()

fclose()


复习必看gitee.com

glibc是Linux中使用最广泛最核心的C语言标准库实现。像: printf malloc open strlen等。

模拟实现:使用open write close核心系统调用来实现fopen fwrite fclose fflush。

文件与缓冲区的关系

输入-缓冲区-文件

采用f系列接口,缓冲区是链接stdin与文件的桥梁。

模拟实现

文件属性

为描述文件属性及库函数的便捷实现,创建以struct IO_FILE类型(MyFile)结构体:

#define MAX typedef struct IO_FILE { int fileNo; //fd int flag; //打开模式:O_WRONLY、O_CREAT、O_TRUNC及O_APPEND char outBuffer[MAX] //缓冲区字符数组 int bufferlen; //outBuffer长度 int flushMethod; //刷新方法 }MyFile;

注意:typedef的使用格式,typedef将类型“struct IO_FILE”以“MyFile”替代。

文件库函数

fopen()

原型:

FILE* fopen(const char* pathname, const char* mode);

//pathname:绝对路径/相对路径
//mode:"w" "r" "a"…………

实现:
MyFile* MyFopen (const char *pathname, const char* f);

1.明确打开方式以对文件属性调整。
2.☆☆☆BuyFile()以malloc申请空间。
3.返回MyFile。

MyFile* MyFopen(const char* pathname, const char* f):

MyFile* MyFopen (const char *pathname, const char* f) { int fd; int flag; // 打开方法定位属性: if(strcmp(f,"r")==0) { fd = open(pathname,O_RDONLY); flag = O_RDONLY; } else if(strcmp(f,"w")==0) { fd = open(pathname, O_WRONLY | O_CREAT | O_TRUNC,0666); flag = O_WRONLY | O_CREAT | O_TRUNC; } else if(strcmp(f,"a")==0) { fd = open(pathname, O_APPEND | O_CREAT, 0666); flag = O_APPEND | O_CREAT; } else { printf("该功能未添加\n"); return NULL; } if(fd == -1) { perror("open failed!!\n"); return NULL; } MyFile* file = BuyFile(fd, flag, LINE_FLUSH); if(file == NULL) { perror("MyFopen::BuyFile() failed\n"); return NULL; } return file; }

MyFile* BuyFile(int _fileNo, int _flag, _flushMethod):

MyFile* BuyFile(int _fileNo, int _flag, int _flushMethod) { //空间申请!! MyFile* newfile=(MyFile*)malloc(sizeof(MyFile)); if(newfile == NULL) return NULL; //memset()初始化好的习惯 memset(newfile, 0, sizeof(MyFile)); //文件属性设置: newfile->fileNo = _fileNo; newfile->flag = _flag; newfile->flushMethod = _flushMethod; return newfile; }
文件打开会不会发生缓冲区内存在内容?而需要缓冲区刷新?

缓冲区有内容<--->写入操作与接下来文件打开的要求矛盾。

fwrite()

1.传参数据拷贝到缓冲区。
☆2.写入完成后是否刷新缓冲区取决于文件打开方式flag。

size_t MyFwrite(const void *ptr, size_t size, size_t nmemb, MyFile *stream) { //1.拷贝到缓冲区 memcpy(stream->outBuffer, ptr, size*nmemb); //bufferlen是字节个数还是元素个数? 肯定是字节个数因为写入文件的全部设置为字符 stream->bufferLen += size*nmemb; //ferite的作用是写入到缓冲区还是写到文件内?明显是写入到缓冲区否则fwrite就没用了。 //要立即刷新缓冲区吗? //刷新缓冲区的目的是拷贝缓冲区内容到文件内 //printf("%d\n",size*nmemb); //缓冲区需要刷新的情况: if((stream->flag & O_TRUNC || stream->flag & O_APPEND) && \ stream->outBuffer[stream->bufferLen-1]=='\n') { printf("缓冲区刷新成功\n"); MyFflush(stream); } return nmemb; }

fflush()

fflush是程序退出/fwrite特定类型后的写入数据操作:

//刷新 int MyFflush(MyFile* stream) { if(stream->bufferLen <= 0) return 0; //清除缓冲区内容到文件内 //操作系统只认fd!! write(stream->fileNo,stream->outBuffer,stream->bufferLen); stream->bufferLen=0; return 0; }

fclose()

☆☆☆清空资源前必先刷新缓冲区:

//Fclose int MyFclose(MyFile* stream) { //close退出强制刷新缓冲区 MyFflush(stream); close(stream->fileNo); //资源释放 free(stream); return 0; }

感谢观看
求关注

http://www.cnnetsun.cn/news/2586453.html

相关文章:

  • 零样本与开放词汇目标检测:从语义对齐到开放世界感知的技术演进与实践
  • 别再手动折腾了!用Docker Compose一键部署Yapi接口管理平台(附完整配置文件)
  • AR物体识别抖动原理与四层实战优化方案
  • Unity Shader Graph溶解特效的物理建模与多尺度实现
  • 3.计算机是如何工作的(进程调度与管理详解)
  • Godot 4开发范式重构:渲染、脚本与场景架构深度指南
  • Godot 4第二版(二):从能跑通到可交付的工程化跃迁
  • 【Claude长文档推理能力深度解密】:20年AI架构师实测127页PDF/EPUB/DOCX文档的逻辑链断裂点与修复公式
  • 对比官方价格,Taotoken折扣活动为高频用户带来的实际节省感受
  • GitHub开源项目周报 · 2026年第21周(2026-05-18 ~ 2026-05-24) · AI编程工具与知识图谱项目集中爆发
  • 实测Taotoken平台GPT模型API调用的响应延迟与稳定性表现
  • 双系统引导翻车自救指南:Clover配置config.plist常见错误排查(附DiskGenius/BOOTICE操作)
  • 从E1帧到2.048Mbit/s:深入解析PCM30/32路系统的帧结构与传输效率
  • 深度体验Taotoken用量看板如何让大模型API消费一目了然
  • 从梯度下降到集成王者:GBDT与GBRT核心原理与实战拆解
  • XDS110固件升级与序列号管理全攻略:解决CCS识别失败与多设备冲突
  • 如何利用Taotoken实现API调用的故障转移与负载均衡
  • 树莓派4B+Python+Adafruit_PCA9685:手把手教你用键盘实时控制舵机(附完整代码)
  • GitHub学生包申请保姆级教程:手把手教你搞定教育邮箱与在校证明(附翻译工具推荐)
  • 视觉地点识别新范式:基于深度与语义几何特征的鲁棒性研究
  • 联想小新必看!面部解锁一键直达桌面,告别繁琐锁屏步骤
  • 提取矩阵某几行和某几列元素
  • 联想 Yoga Book 9 13IRU8 隐藏技巧!部件栏这样用效率翻倍
  • LDA与Word2vec融合:构建动态自动化文本标注系统
  • Lovable设计工具开发全链路解析(含Figma插件+VS Code扩展双实现)
  • AI剪辑工具怎么选:先用决策树判断你需要的是辅助功能还是生产系统
  • 告别插件安装!在Linux上手动配置ESP-IDF + VSCode开发环境(附环境变量永久生效技巧)
  • 别再手动画甘特图!AI工具自动生成超方便
  • 避坑指南:用Qt开发蓝牙上位机时,那些官方文档没细说的信号槽和内存管理
  • 冲上热搜第9!芯片半导体为何暴涨?揭秘背后核心逻辑