缓冲区的理解和实现

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

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

Mystdio.c文件:

cpp 复制代码
#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文件:

cpp 复制代码
#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文件:

cpp 复制代码
#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;
}
相关推荐
Flynt22 分钟前
OpenJDK禁AI代码半年了,现在执行得怎么样?答案是:全靠自觉
java·开源·ai编程
ModyQyW39 分钟前
vite-plugin-uni-manifest 更新了什么
前端·typescript·uni-app
Asize2 小时前
AI 协作开发新范式:我用 SDD 做了个排版 npm 包
前端·人工智能
kyriewen3 小时前
我把今年流传的前端 AI 面试题整理了一遍——4 类场景题+回答框架(附速查表)
前端·面试·程序员
计算机魔术师4 小时前
国产多模态模型正面硬刚Opus旗舰:差距从30%缩到3%
前端
风骏时光牛马4 小时前
程序员进阶:深度思考,解锁职场成长的底层逻辑
前端
IT_陈寒4 小时前
用了Proxy才发现以前的JavaScript白写了
前端·人工智能·后端
爱丶不疚5 小时前
Eval: Agent 说的 Eval 是什么?从单测、TDD 到 Sentry 聊起
前端·ai编程·vibecoding
求道於盲5 小时前
python中的类型标注
前端
计算机魔术师5 小时前
从硅谷测试到全球铺开,ChatGPT广告的10亿美元秘密
前端