news 2026/6/9 18:35:35

缓冲区的理解和实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
缓冲区的理解和实现

缓冲区的相关理解以及概念、

模拟C语言库的缓冲区和文件相关封装的实现:

Mystdio.c文件:

#define FILE_MODE 0666 _FILE* _fopen(const char *filename, const char *flag) { assert(filename); assert(flag); int mode = 0; size_t fd = -1; //判断打开方式,模拟w、a、r if(strcmp(flag,"w") == 0) { //设置文件权限 mode = (O_CREAT|O_WRONLY|O_TRUNC); //打开文件 fd = open(filename,mode,FILE_MODE); } else if(strcmp(flag,"a") == 0) { mode = (O_CREAT|O_WRONLY|O_APPEND); fd = open(filename,mode,FILE_MODE); } else if(strcmp(flag,"r") == 0) { mode = O_RDONLY; fd = open(filename,mode); } else { return NULL; } //有可能文件都没打开 if(fd == -1) { return NULL; } //把fd放到_FILE结构体对象中 _FILE* fp = (_FILE*)malloc(sizeof(_FILE)); if(fp == NULL) { perror("malloc fail"); return NULL; } fp->fileno = fd; fp->flag = FLUSH_LINE;//行刷新 fp->out_pos = 0; return fp; } int _fwrite(_FILE *fp, const char *s, int len) { //将s拷贝到缓冲区中 memcpy(&fp->outbuffer[fp->out_pos],s,len); fp->out_pos += len; //判断刷新方式 if(fp->flag & FLUSH_NOW) { //立即刷新 write(fp->fileno,fp->outbuffer,fp->out_pos); fp->out_pos = 0; } else if(fp->flag & FLUSH_LINE) { //行刷新 if(fp->outbuffer[fp->out_pos] == '\n') { write(fp->fileno,fp->outbuffer,fp->out_pos); fp->out_pos = 0; } else { return len; } } else if(fp->flag & FLUSH_ALL) { //全缓冲 if(fp->out_pos == SIZE) { write(fp->fileno,fp->outbuffer,fp->out_pos); fp->out_pos = 0; } else { return len; } } } void _fflush(_FILE *fp) { if(fp->out_pos > 0) { write(fp->fileno,fp->outbuffer,fp->out_pos); fp->out_pos = 0; } } void _fclose(_FILE *fp) { if(fp == NULL) { return ; } _fflush(fp); close(fp->fileno); free(fp); }

Mystdio.h文件:

#ifndef __MYSTDIO_H__ #define __MYSTDIO_H__ #include<string.h> #define SIZE 1024 #define FLUSH_NOW 1 #define FLUSH_LINE 2 #define FLUSH_ALL 4 typedef struct IO_FILE { int fileno;//文件描述符 int in_pos;//缓冲区已经写了多少 char inbuffer[SIZE];//输入缓冲区 int out_pos;//缓冲区已经写了多少 char outbuffer[SIZE];//输出缓冲区 int flag;//刷新方式 }_FILE; void _fflush(_FILE *fp); _FILE* _fopen(const char *filename, const char *flag); int _fwrite(_FILE *fp, const char *s, int len); void _fclose(_FILE *fp); #endif

测试main.c文件:

#include "Mystdio.h" int main() { _FILE *fp = _fopen("test.txt","a"); if(fp == NULL) { return 1; } const char *message = "I miss you\n"; _fwrite(fp,message,strlen(message)); _fflush(fp); _fclose(fp); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 23:16:47

NoFences终极指南:免费开源的Windows桌面整理革命

您的Windows桌面是否经常被各种图标堆满&#xff0c;找文件如同大海捞针&#xff1f;面对杂乱无章的桌面环境&#xff0c;工作效率是否大打折扣&#xff1f;NoFences作为一款完全免费的开源桌面整理工具&#xff0c;将彻底改变您的数字工作空间体验。 【免费下载链接】NoFences…

作者头像 李华
网站建设 2026/6/10 11:26:04

存量深耕与拓展下的中国电梯行业

雪莲珠峰数字宇宙平台的韩总说&#xff1a;作为现代城市垂直交通的核心载体&#xff0c;电梯行业的发展轨迹与城市化进程、房地产周期、人口结构变化深度绑定。中国已成为全球最大的电梯生产、消费和保有国&#xff0c;产量占全球70%以上&#xff0c;保有量突破1200万台&#x…

作者头像 李华
网站建设 2026/6/10 12:58:51

HunterPie:终极怪物猎人世界智能狩猎助手完全指南

HunterPie&#xff1a;终极怪物猎人世界智能狩猎助手完全指南 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/gh_mirrors/hu/HunterPie-legacy…

作者头像 李华
网站建设 2026/6/10 14:42:22

魔兽世界API工具终极指南:从宏命令到插件开发的完整教程

魔兽世界API工具终极指南&#xff1a;从宏命令到插件开发的完整教程 【免费下载链接】wow_api Documents of wow API -- 魔兽世界API资料以及宏工具 项目地址: https://gitcode.com/gh_mirrors/wo/wow_api 还在为魔兽世界复杂的技能组合而头疼吗&#xff1f;想要一键释放…

作者头像 李华
网站建设 2026/6/10 12:58:54

Visual C++运行库完整修复指南:告别软件闪退的终极解决方案

Visual C运行库完整修复指南&#xff1a;告别软件闪退的终极解决方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为"应用程序无法正常启动"而…

作者头像 李华
网站建设 2026/6/10 6:28:59

无名杀扩展宝典:300+武将角色快速上手全攻略

无名杀扩展宝典&#xff1a;300武将角色快速上手全攻略 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 想要在无名杀游戏中体验超过300位各具特色的武将角色吗&#xff1f;这篇完整指南将带你快速掌握扩展安装和管理的核心技巧&…

作者头像 李华