缓冲区的理解和实现

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

模拟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;
}
相关推荐
wangbing112511 分钟前
平台介绍-modbus设备调试
java
开开心心就好17 分钟前
音频降噪剪辑工具,音量裁剪一键处理
运维·服务器·前端·spring·ocr·音视频·1024程序员节
一枕槐安48729 分钟前
大模型限流、重试、超时处理:API 调用健壮性方案
linux·服务器·php·大模型api·指数退避·限流控制·超时预算
黑十29 分钟前
PyTorch 报 “no CUDA GPUs are available“ 怎么办?3 步排查
服务器·网络·人工智能·pytorch·python
D e re k ZH33 分钟前
P5025 [SNOI2017] 炸弹
c++·算法
西索斯coding35 分钟前
gpt-image-2.5-sunburst 和 gemini-3.1-flash-image 差多少?60 组项目素材的成功成本评测框架
java·linux·gpt·ai
threelab1 小时前
开源图片去水印代码
python
wuminyu1 小时前
Java字节码学习总结:字节码如何加载、解析和执行
java·linux·c语言·jvm·c++
qq_406981031 小时前
c++的decltype是什么
开发语言·c++
坤坤子吖1 小时前
算法学习——单调队列
开发语言·c++·笔记·学习·算法