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

模拟文件打开写入关闭的过程

my_stdio.h

#pragma once #define SIZE 1024 #define FLUSH_NONE 0 #define FLUSH_LINE 1 #define FLUSH_FULL 2 struct IO_FILE { int flag; // 刷新方式 int fileno; // 文件描述符 char outbuffer[SIZE]; int cap; int size; // TODO }; typedef struct IO_FILE mFILE; mFILE *mfopen(const char *filename, const char *mode); int mfwrite(const void *ptr, int num, mFILE *stream); void mfflush(mFILE *stream); void mfclose(mFILE *stream);

my_stdio.c

#include "my_stdio.h" #include <string.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> mFILE *mfopen(const char *filename, const char *mode) { int fd = -1; if(strcmp(mode, "r") == 0) { fd = open(filename, O_RDONLY); } else if(strcmp(mode, "w")== 0) { fd = open(filename, O_CREAT|O_WRONLY|O_TRUNC, 0666); } else if(strcmp(mode, "a") == 0) { fd = open(filename, O_CREAT|O_WRONLY|O_APPEND, 0666); } if(fd < 0) return NULL; mFILE *mf = (mFILE*)malloc(sizeof(mFILE)); if(!mf) { close(fd); return NULL; } mf->fileno = fd; mf->flag = FLUSH_LINE; mf->size = 0; mf->cap = SIZE; return mf; } void mfflush(mFILE *stream) { if(stream->size > 0) { // 写到内核文件的文件缓冲区中! write(stream->fileno, stream->outbuffer, stream->size); // 刷新到外设 fsync(stream->fileno); stream->size = 0; } } int mfwrite(const void *ptr, int num, mFILE *stream) { // 1. 拷贝 memcpy(stream->outbuffer+stream->size, ptr, num); stream->size += num; // 2. 检测是否要刷新 if(stream->flag == FLUSH_LINE && stream->size > 0 && stream->outbuffer[stream->size-1]== '\n') { mfflush(stream); } return num; } void mfclose(mFILE *stream) { if(stream->size > 0) { mfflush(stream); } close(stream->fileno); }

我们用文字来描述一下过程:

我们C语言在写文件的时候,是写到对应文件的缓冲区里面的,在关闭文件的时候会将文件缓冲区里面的内容刷新到操作系统缓冲区里面,进而写到外设上去

http://www.jsqmd.com/news/795166/

相关文章:

  • 2026年中山GEO优化服务商推荐:五家实力机构综合选型分析参考 - 产业观察网
  • 银泰百货卡回收技巧分享:常见回收问题解答! - 团团收购物卡回收
  • 免费LLM API集成实战:从选型到构建高可用AI服务
  • 华为光猫配置解密工具终极技术指南:深度解析AES加密与XML/CFG文件处理
  • 2026年中山五金配件定制厂家怎么选?工程装修采购避坑指南与靠谱供应商对标 - 优质企业观察收录
  • 百度网盘秒传技术终极指南:打破文件分享的时间限制
  • 如何高效使用Equalizer APO:从音频优化到专业级声学校准的完整指南
  • 打造你的专属桌面伙伴:DyberPet开源桌面宠物框架完全指南
  • 终极指南:3分钟实现GitHub下载速度50倍提升
  • Fast-GitHub:GitHub访问加速的技术解决方案与实现原理
  • 终极音频解密指南:3分钟解锁QQ音乐加密格式
  • 2026年广州白蚁防治公司哪家好?越秀区/天河区/荔湾区/海珠区/白云区/番禺区各区专业上门灭白蚁推荐 - 品牌推荐大师
  • 大语言模型评估指南:从ChatGPT评测看LLM能力边界与挑战
  • OpenAI 工程师翁家翌实验:AI 可“自主改代码”变强,Heuristic Learning 产业应用前景几何?
  • 3步掌握B站视频下载神器:解锁4K大会员画质的终极方案
  • 告别人力搬运数据,采用TurboEx邮件数据摆渡系统 - 拓波TurboEx邮件系统
  • Anthropic、OpenClaw让AI“做梦”“记忆”,SubQ模型拓展上下文,模糊人机边界!
  • 《求教:用阿里云处理Ozon图片的具体参数怎么设置,搜索匹配度最高?》
  • OpenAI做了一次豪赌:不给任何指令,让模型自己学会所有任务
  • 2026 江苏淮安彩钢瓦金属屋面外墙防水补漏防腐翻新公司哪家好?TOP5 权威推荐 + 避坑指南 - 速递信息
  • 抖音无水印下载神器:3分钟搞定批量下载,小白也能轻松上手
  • 3分钟搞定浏览器Cookie导出:Get cookies.txt LOCALLY终极指南
  • 2026年佛山五金配件定制与金属制品工程配套完全选购指南 - 优质企业观察收录
  • 如何永久备份微信聊天记录?WeChatMsg数据守护完整指南
  • 金价连跌,鹰潭黄金变现难?福正美给出避险最优解 - 福正美黄金回收
  • 使用Curxy代理连接Cursor与本地Ollama:解决云端无法访问localhost的AI编程方案
  • 鸿蒙C库适配问题总结
  • Mac跨平台文件传输的终极自由:Nigate开源工具如何打破NTFS读写壁垒
  • 2026年美国一件代发海外仓横评:仓网覆盖、履约时效与尾程成本全对比 - 科技焦点
  • 为什么ComfyUI-Impact-Pack V8安装后关键节点缺失?完整解决路径