news 2026/4/15 18:22:44

缓冲区的理解和实现

作者头像

张小明

前端开发工程师

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/4/11 22:00:14

终极指南:如何免费将网易云NCM格式转换为MP3/FLAC

终极指南&#xff1a;如何免费将网易云NCM格式转换为MP3/FLAC 【免费下载链接】ncmdump 转换网易云音乐 ncm 到 mp3 / flac. Convert Netease Cloud Music ncm files to mp3/flac files. 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdump 还在为网易云音乐下载的NC…

作者头像 李华
网站建设 2026/4/14 23:03:11

百度网盘分享IndexTTS2资源被封?改用合规云存储方案

百度网盘分享IndexTTS2资源被封&#xff1f;改用合规云存储方案 在AI语音合成技术快速渗透内容创作、虚拟主播和智能客服的今天&#xff0c;一个现实问题正困扰着大量开发者&#xff1a;你辛辛苦苦配置好的IndexTTS2环境&#xff0c;为什么第一次启动时总是卡在“下载模型”这一…

作者头像 李华
网站建设 2026/4/14 5:09:56

浏览器下载速度翻倍:Motrix WebExtension终极加速指南

还在为浏览器下载速度慢如蜗牛而烦恼吗&#xff1f;Motrix WebExtension作为专业的下载管理器扩展&#xff0c;能够智能接管浏览器下载任务&#xff0c;让你的下载体验从此焕然一新。这款浏览器扩展通过将下载任务无缝转发给Motrix下载管理器&#xff0c;利用多线程技术实现下载…

作者头像 李华
网站建设 2026/4/13 18:10:35

AppleRa1n完整技术指南:iOS 15-16.6无网络iCloud绕过解决方案

AppleRa1n完整技术指南&#xff1a;iOS 15-16.6无网络iCloud绕过解决方案 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n AppleRa1n是一款基于Palera1n越狱框架深度定制的专业工具&#xff0c;专门针对…

作者头像 李华
网站建设 2026/4/9 9:23:05

MyBatisPlus字段填充功能?自动记录IndexTTS2生成时间

MyBatisPlus字段填充功能&#xff1f;自动记录IndexTTS2生成时间 在构建AI语音合成系统时&#xff0c;我们常常关注的是“声音是否自然”“情感表达是否到位”&#xff0c;却容易忽略一个看似不起眼但至关重要的问题&#xff1a;这次语音是什么时候生成的&#xff1f; 尤其是在…

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

B站缓存视频转换教程:m4s文件快速转MP4完整指南

B站缓存视频转换教程&#xff1a;m4s文件快速转MP4完整指南 【免费下载链接】m4s-converter 将bilibili缓存的m4s转成mp4(读PC端缓存目录) 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 还在为B站缓存的m4s视频无法在其他播放器打开而困扰吗&#xff1f;…

作者头像 李华