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

news2024/11/25 4:26:30

在这里插入图片描述

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

文章目录


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

myfile.c

#include "Mystdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>

#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);
}

myfile.h

#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 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

main.c

#include "Mystdio.h"
#include <unistd.h>

#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;
}

大家自己下去测试一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1179648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ACmix:卷积和self-attention的结合,YOLOv5改进之ACmix

目录 一、ACmix理论部分 二、代码 三、YOLOv5改进 ACC3 一、ACmix理论部分 论文地址:2111.14556.pdf (arxi

Git简介和安装

一&#xff0c;Git简介 Git 是一个分布式版本控制工具&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。通过Git 仓库来存储和管理这些文件&#xff0c;Git 仓库分为两种&#xff1a; 本地仓库&#xff1a;开发人员自己电脑上的 Git 仓库 远程仓库&#xff1a;远程…

centos部署nginx集群

部署nginx集群&#xff0c;一台nginx出故障&#xff0c;另外的nginx能直接使用&#xff08;这里用两台做实验&#xff09; 规划&#xff1a;143.1.26.212是主&#xff0c;143.1.26.213是从&#xff0c;143.1.26.214是VIP&#xff08;vip是客户访问的ip&#xff09; 小白教程&…

浅谈剩余电流动作继电器在电动伸缩门的应用

摘 要&#xff1a;随着时代的发展&#xff0c;越来越多的小区、厂区、园区和学校等场所的大门安装了电动伸缩门&#xff0c;几乎可以说随处可见。电动伸缩门是一种长期在户外使用的设备&#xff0c;工作电压为220 V&#xff08;过去也有380 V&#xff09;&#xff0c;其电机是处…

文件批量移动自动创建文件夹及生成编号重命名,让整理更轻松

在我们日常的生活和工作中&#xff0c;文件的整理和管理是至关重要的一项任务。有时候&#xff0c;我们需要将大量的文件转移到不同的文件夹中&#xff0c;并对它们进行重命名。手动执行这些任务不仅耗时&#xff0c;而且容易出错。云炫文件管理器能够轻松实现文件的批量移动、…

HF Hub 现已加入存储区域功能

我们在 企业版 Hub 服务 方案中推出了 存储区域&#xff08;Storage Regions&#xff09; 功能。https://hf.co/enterprise 通过此功能&#xff0c;用户能够自主决定其组织的模型和数据集的存储地点&#xff0c;这带来两大显著优势&#xff0c;接下来的内容会进行简要介绍&…

CSS特效001:鼠标放div上,实现旋转、放大、移动等效果

GPT能够很好的应用到我们的代码开发中&#xff0c;能够提高开发速度。你可以利用其代码&#xff0c;做出一定的更改&#xff0c;然后实现效能。 css实战中&#xff0c;经常会看到这样的场景&#xff0c;鼠标放到一个图片或者一个div块状时候&#xff0c;会出现旋转、放大、移动…

基于SSM的办公自动化管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

基于孔雀算法的无人机航迹规划-附代码

基于孔雀算法的无人机航迹规划 文章目录 基于孔雀算法的无人机航迹规划1.孔雀搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用孔雀算法来优化无人机航迹规划。 1.孔雀搜索算法 …

云安全—Dashboard 攻击面

0x00 前言 众所诸知&#xff0c;如果只是一味的REST接口或者命令行话的操作方式&#xff0c;就会变相的提高操作门款&#xff0c;并且不会有很好的呈现方式&#xff0c;所以就有了web ui的方式&#xff0c;也就是Dashboar面板&#xff0c;本篇主要讨论一下关于Dashboar面板的概…

Solidity之变量数据存储和作用域

引用类型 引用类型(Reference Type)&#xff1a;包括数组&#xff08;array&#xff09;&#xff0c;结构体&#xff08;struct&#xff09;和映射&#xff08;mapping&#xff09;&#xff0c;这类变量占空间大&#xff0c;赋值时候直接传递地址&#xff08;类似指针&#xff…

加州驾照笔试准备笔记

文章目录 数字错题注意事项 参考文档&#xff1a;官方中文文档 数字 BAC&#xff1a;21岁以下0.01%&#xff1b;其它成人是 0.08%當有車輛向您駛來時&#xff0c;在距離對方車輛 500 英尺內&#xff0c;或&#xff0c;同向行駛的前方車輛距離您不超過 300 呎&#xff0c;將遠光…

01-MySQL-安装

一、windows安装mysql 安装详情查看 https://blog.csdn.net/cygqtt/article/details/124396223 二、CentOS安装mysql (方式一) ①&#xff1a;安装MySQL 8的存储库 # 安装前可以更新一下yum包 yum updatewget https://repo.mysql.com//mysql80-community-release-el7-3.noarc…

04-MySQL-基础-多表查询事务

一、多表查询 ①&#xff1a;多表关系 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结 构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分…

RAID卡管理工具使用

RAID 基本概念 由于现代数据中心业务量的与日俱增&#xff0c;单台服务器上需要运行的数据也日益增多。当 单个物理磁盘在容量和安全性上不足以支持系统业务时&#xff0c;就需要将多个磁盘以某种特 定方式组合起来&#xff0c;对外作为一个可见的磁盘来使用&#xff0c;才可…

你知道在游戏开发中怎么将算法与其作用的对象隔离开来吗?

点击上方亿元程序员关注和★星标 引言 你可能知道的设计模式-访问者模式 大家好&#xff0c;今天我们要来聊一聊在游戏开发中非常实用的设计模式——访问者模式。访问者模式是一种将算法与对象结构分离的软件设计模式&#xff0c;它可以让代码更加灵活、可扩展&#xff0c;同…

11.6区间估计、置信区间

已知总体方差 就是说&#xff0c;在总体里随机取样的时候&#xff0c;取样的均值服从总体的均值&#xff0c;方差为总体均值方差与样本量比值的正态分布&#xff0c;样本量越小&#xff0c;方差越大&#xff0c;样本量越大&#xff0c;方差越小&#xff0c;取样的样本均值浮动…

VMware ifconfig ip报错解决记录

1.报错 ifconfig后出现以下报错 lo: flags73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 9216 b…

5.5逆波兰表达式求值(LC150-M)

算法&#xff1a; 其实就是后缀表达式。 本题中每一个子表达式要得出一个结果&#xff0c;然后拿这个结果再进行运算&#xff0c;那么这岂不就是一个相邻字符串消除的过程&#xff0c;和1047.删除字符串中的所有相邻重复项 (opens new window)中的对对碰游戏是不是就非常像了…

PostgreSQL JDBC连接详解(附DEMO)

PostgreSQL JDBC连接详解 PostgreSQL JDBC连接详解摘要引言1. JDBC基础1.1 JDBC简介1.2 JDBC驱动程序1.3 建立JDBC连接 2. 配置PostgreSQL JDBC连接2.1 PostgreSQL连接JDBC2.2 PostgreSQL连接JDBC是否成功2.3 PostgreSQL连接JDBC获取表信息注释等2.4 PostgreSQL连接JDBC根据表名…