news 2026/8/8 14:40:45

缓冲区的理解和实现

作者头像

张小明

前端开发工程师

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/8/7 17:42:17

Motrix WebExtension终极下载加速方案:告别龟速下载新时代

还在为下载大文件时进度条像蜗牛一样缓慢移动而焦虑吗&#xff1f;当传统浏览器下载让你一次次面对中断、卡顿和效率低下的困扰时&#xff0c;Motrix WebExtension带来了革命性的解决方案。这款智能浏览器扩展通过专业下载管理器的强力加持&#xff0c;让你的下载速度实现质的飞…

作者头像 李华
网站建设 2026/8/1 0:22:27

GitHub数据镜像终极指南:快速构建企业级数据仓库

GitHub数据镜像终极指南&#xff1a;快速构建企业级数据仓库 【免费下载链接】github-mirror Scripts to mirror Github in a cloudy fashion 项目地址: https://gitcode.com/gh_mirrors/gi/github-mirror 在当今数据驱动的开发时代&#xff0c;GitHub作为全球最大的代码…

作者头像 李华
网站建设 2026/7/26 3:55:41

3分钟快速获取阿里云盘Refresh Token:二维码扫码工具完整指南

3分钟快速获取阿里云盘Refresh Token&#xff1a;二维码扫码工具完整指南 【免费下载链接】aliyundriver-refresh-token QR Code扫码获取阿里云盘refresh token For Web 项目地址: https://gitcode.com/gh_mirrors/al/aliyundriver-refresh-token 还在为阿里云盘API授权…

作者头像 李华
网站建设 2026/8/8 6:17:28

一键部署GitHub数据同步神器:云端镜像工具全解析

一键部署GitHub数据同步神器&#xff1a;云端镜像工具全解析 【免费下载链接】github-mirror Scripts to mirror Github in a cloudy fashion 项目地址: https://gitcode.com/gh_mirrors/gi/github-mirror 在当今开源协作的时代&#xff0c;GitHub已成为全球开发者不可或…

作者头像 李华
网站建设 2026/8/1 1:21:01

Honey Select 2增强补丁:让游戏体验瞬间升级的完整指南

还在为游戏中的各种技术问题烦恼吗&#xff1f;角色加载失败、插件冲突、画面异常&#xff0c;这些困扰玩家已久的难题现在有了完美解决方案。HF Patch作为一款精心设计的增强工具包&#xff0c;整合了超过200个优质插件和模组&#xff0c;将彻底改变你的游戏体验。 【免费下载…

作者头像 李华
网站建设 2026/8/4 10:53:44

Tsukimi播放器终极指南:解锁专业级媒体播放新体验

想要一款既专业又易用的媒体播放器吗&#xff1f;Tsukimi播放器正是您寻找的完美解决方案&#xff01;这款基于GTK4-RS开发的第三方Jellyfin客户端&#xff0c;以其卓越的性能表现和人性化的界面设计&#xff0c;让每位用户都能轻松享受高品质的媒体播放体验。&#x1f3ac; 【…

作者头像 李华