缓冲区的理解和实现

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

模拟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;
}
相关推荐
m0_7434703723 分钟前
高性能计算框架实现
开发语言·c++·算法
weixin_3077791323 分钟前
2025年中国研究生数学建模竞赛A题:通用神经网络处理器下的核内调度问题——解决方案与实现
开发语言·人工智能·python·数学建模·性能优化
1104.北光c°25 分钟前
基于Canal + Kafka的高可用关注系统:一主多从关系链
java·开发语言·笔记·分布式·程序人生·kafka·一主多从
2501_9249526925 分钟前
Python深度学习入门:TensorFlow 2.0/Keras实战
jvm·数据库·python
Mem0rin26 分钟前
[Java]异常及其处理
java·开发语言
HelloReader26 分钟前
Qt Quick vs Qt Widgets如何选择适合你的 UI 技术路线(五)
前端
skiy27 分钟前
Spring boot创建时常用的依赖
java·spring boot·后端
2401_8914821728 分钟前
Python多线程与多进程:如何选择?(GIL全局解释器锁详解)
jvm·数据库·python
2401_8512729928 分钟前
用Python实现自动化的Web测试(Selenium)
jvm·数据库·python
cmd29 分钟前
吃透 ES6 Generator:yield/next/yield* 核心用法详解
前端·javascript