• 【Linux】-模拟实现一个缓冲区


    在这里插入图片描述

    💖作者:小树苗渴望变成参天大树🎈
    🎉作者宣言:认真写好每一篇博客💤
    🎊作者gitee:gitee
    💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法🎄
    如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

    文章目录


    通过前面的知识博主就带大家实现一个简单的缓冲区

    myfile.c

    #include "Mystdio.h"
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #define FILE_MODE 0666
    
    // "w", "a", "r"
    _FILE * _fopen(const char*filename, const char *flag)
    {
        assert(filename);
        assert(flag);
    
        int f = 0;
        int fd = -1;
        if(strcmp(flag, "w") == 0) {
            f = (O_CREAT|O_WRONLY|O_TRUNC);
            fd = open(filename, f, FILE_MODE);
        }
        else if(strcmp(flag, "a") == 0) {
            f = (O_CREAT|O_WRONLY|O_APPEND);
            fd = open(filename, f, FILE_MODE);
        }
        else if(strcmp(flag, "r") == 0) {
            f = O_RDONLY;
            fd = open(filename, f);
        }
        else 
            return NULL;
    
        if(fd == -1) return NULL;
    
        _FILE *fp = (_FILE*)malloc(sizeof(_FILE));
        if(fp == NULL) return NULL;
    
        fp->fileno = fd;
        //fp->flag = FLUSH_LINE;
        fp->flag = FLUSH_ALL;
        fp->out_pos = 0;
    
        return fp;
    }
    
    // FILE中的缓冲区的意义是什么????
    int _fwrite(_FILE *fp, const char *s, int len)
    {
        // "abcd\n"
        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-1] == '\n'){ // 不考虑其他情况
                write(fp->fileno, fp->outbuffer, fp->out_pos);
                fp->out_pos = 0;
            }
        }
        else if(fp->flag & FLUSH_ALL)
        {
            if(fp->out_pos == SIZE){
                write(fp->fileno, fp->outbuffer, fp->out_pos);
                fp->out_pos = 0;
            }
        }
    
        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);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92

    myfile.h

    #ifndef __MYSTDIO_H__
    #define __MYSTDIO_H__
    
    #include 
    
    #define SIZE 1024
    
    #define FLUSH_NOW 1
    #define FLUSH_LINE 2
    #define FLUSH_ALL 4
    
    typedef struct IO_FILE{
        int fileno;
        int flag; 
        //char inbuffer[SIZE];
        //int in_pos;
        char outbuffer[SIZE]; // 用一下这个
        int out_pos;
    }_FILE;
    
    _FILE * _fopen(const char*filename, const char *flag);
    int _fwrite(_FILE *fp, const char *s, int len);
    void _fclose(_FILE *fp);
    
    
    
    
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    main.c

    #include "Mystdio.h"
    #include 
    
    #define myfile "test.txt"
    
    int main()
    {
        _FILE *fp = _fopen(myfile, "a");
        if(fp == NULL) return 1;
    
        const char *msg = "hello world\n";
        int cnt = 10;
        while(cnt){
            _fwrite(fp, msg, strlen(msg));
            // fflush(fp);
            sleep(1);
            cnt--;
        }
    
        _fclose(fp);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    大家自己下去测试一下

  • 相关阅读:
    OpenCV读写文件
    搭建qemu RISC-V运行Linux环境
    两台服务器间进行文件传输
    android插件开发
    知识链接,人工智能可以帮助人类验证世界知识吗?#verify_wikipedia
    Dll文件注册器 - 开源研究系列文章 - 个人小作品
    单商户商城系统功能拆解10—商城风格
    自制Linux精简系统
    Mac平台M1PRO芯片MiniCPM-V-2.6网页部署跑通
    【操作系统】 内存管理
  • 原文地址:https://blog.csdn.net/qq_69369227/article/details/134232181