缓冲区的理解和实现

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

模拟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;
}
相关推荐
吴老弟i1 小时前
基于 VSCode 实现 Python 开发与调试 | 环境配置搭建 | PIP Anaconda
vscode·python·pip
苦藤新鸡1 小时前
2.字母异位词分组
c语言·c++·力扣·哈希算法
七夜zippoe1 小时前
异步编程实战:构建高性能Python网络应用
开发语言·python·websocket·asyncio·aiohttp
tianyuanwo1 小时前
Python虚拟环境深度解析:从virtualenv到virtualenvwrapper
开发语言·python·virtualenv
越甲八千1 小时前
ORM 的优势
数据库·python
是有头发的程序猿1 小时前
Python爬虫防AI检测实战指南:从基础到高级的规避策略
人工智能·爬虫·python
grd41 小时前
Electron for OpenHarmony 实战:Pagination 分页组件实现
python·学习
SimonKing1 小时前
你的网站SSL证书又要过期了?这个工具能让你永久告别焦虑
java·后端·程序员
CryptoRzz1 小时前
印度交易所 BSE 与 NSE 实时数据 API 接入指南
java·c语言·python·区块链·php·maven·symfony
光影少年1 小时前
前端如何虚拟列表优化?
前端·react native·react.js