Linux MyFile

在之前,我们应该都多少接触过了C语言的文件管理,fopen,fclose,fputs....等函数的用法,也分析了系统层面上C语言是如何实现文件管理的。

回顾

上一个文章,我们讲解了十分重要的知识,在文件被打开时会生成进程,而这个进程就拥有着属于它的缓冲区,而缓冲区拥有着满足各自需求的刷新策略,比如说标准输出(stdout)是遇到\n刷新。也着重讲解了文件被打开是被包含于PCB存储的struct files_struct当中。

686e7a6cb580421e881210a8887ee7cc.png

 今天,我们就来自己简单实现一个自己的MyFILE

#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<string.h>
#include<assert.h>typedef struct MyFILE{int fd;char buf[1024];size_t end;    //end代表存储的有效数据个数
}MyFILE;MyFILE* fopen_(const char* pathname ,const char* mode)
{assert(pathname);assert(mode);int fd = -1;if(strcmp(mode,"r") == 0){fd = open(pathname,O_RDONLY);}else if(strcmp(mode,"w") == 0){fd = open(pathname,O_WRONLY|O_CREAT|O_TRUNC,0666);}else if(strcmp(mode,"a") == 0){fd = open(pathname,O_WRONLY|O_CREAT|O_APPEND,0666);}if(fd < 0) return NULL;MyFILE* newfile = (MyFILE*)calloc(0,sizeof(MyFILE));newfile->fd = fd;//end初始化为0,代表缓冲区没有存任何数据newfile->end = 0;return newfile;
}
void fclose_(MyFILE* stream)
{assert(stream);if(stream->end > 0){write(stream->fd,stream->buf,strlen(stream->buf));}close(stream->fd);
}void fputs_(const char* string, MyFILE* stream)
{assert(stream);assert(string);//往缓冲区添加数据strcpy(stream->buf+stream->end,string);stream->end += strlen(string);if(stream->fd == 1){//标准输出  行刷新策略if(stream->buf[stream->end-1] == '\n'){//for degugprintf("fflush: %s\n",stream->buf);write(stream->fd,stream->buf,strlen(stream->buf));stream->end = 0;}}else if(stream->fd == 0){//标准输入 视为普通文件即可}else{//普通文件}
}void fgets_(MyFILE* stream , char* string)
{assert(stream);assert(string);strncpy(string,stream->buf,stream->end);if(sizeof(string) > stream->end){*(string+stream->end) = '\0';}else{*(string+sizeof(string)-1) = '\0';}
}
int main(int argc, const char* argv[])
{MyFILE* file1 = fopen_("log.txt","w");char str1[128] = "hello world\n";fputs_(str1,file1);fclose_(file1);return 0;

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

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

相关文章

成集云 | 用友NC集成聚水潭ERP(用友NC主管供应链)| 解决方案

源系统成集云目标系统 方案介绍 用友NC是用友NC产品的全新系列&#xff0c;是面向集团企业的世界级高端管理软件。它以“全球化集团管控、行业化解决方案、全程化电子商务、平台化应用集成”的管理业务理念而设计&#xff0c;采用J2EE架构和先进开放的集团级开发平台…

平板用的触控笔什么牌子好?性价比高的触控笔推荐

随着平板电脑的普及&#xff0c;越来越多用户为了方便都选择了电容笔&#xff0c;电容笔已经完全代替了我们的手指&#xff0c;并且使我们的书写速度得到了极大的提升。然而&#xff0c;因为其的独特的重力压感功能与芯片技术&#xff0c;导致了原装笔的售价一直居高不下&#…

JavaScript - canvas - 放大镜

效果 示例 项目结构&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>放大镜</title><style type"text/css">div {width: 200px;height: 200px;display: inline-bl…

2023-09-20 Android CheckBox 让文字显示在选择框的左边

一、CheckBox 让文字在选择框的左边 &#xff0c;在布局文件里面添加下面一行就可以。 android:layoutDirection"rtl" 即可实现 android:paddingStart"10dp" 设置框文间的间距 二、使用的是left to right <attr name"layoutDirection">&…

RGB格式

Qt视频播放器实现&#xff08;目录&#xff09; RGB的使用场景 目前&#xff0c;数字信号源&#xff08;直播现场的数字相机采集的原始画面&#xff09;和显示设备&#xff08;手机屏幕、笔记本屏幕、个人电脑显示器屏幕&#xff09;使用的基本上都是RGB格式。 三原色 RGB是…

网络协议层次模型

OSI 七层模型 在 OSI 网络分层模型中&#xff0c;每个分层都接收由它下一层所提供的特定服务&#xff0c;并且负责为自己的上一层提供特定的服务。上下层之间进行交互时所遵循的约定叫做接口 &#xff1b;同一层之间的交互所遵循的约定叫做协议&#xff0c; 下图是 OSI 七层…

2023华为杯研究生数学建模竞赛CDEF题思路+模型代码

全程更新华为杯研赛CDEF题思路模型及代码&#xff0c;大家查看文末名片获取 华为杯C题思路分析 问题一 在每个评审阶段&#xff0c;作品通常都是随机分发的&#xff0c;每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比性&#xff0c;不同专家评审的作…

SpringBoot轻松实现项目集成Knife4j接口文档

Knife4j 介绍 Knife4j 官网 Knife4j是一款基于Swagger生成API文档的增强工具&#xff0c;它简化了开发者构建和管理RESTful API文档的过程。通过自动扫描项目中的接口信息&#xff0c;Knife4j能够生成详细、易读的API文档&#xff0c;无需手动编写和维护。它提供交互式的接口调…

CSP-J/S 2023第一轮认证晋级分数线有些爆冷,超出想象

昨天广东、江西、内蒙古、河北、江苏、吉林、四川相继公布了第一轮认证成绩和晋级分数线。 爆冷 说实在话&#xff0c;看到这个分数线&#xff0c;我有些意外。 省份 CSP-J CSP-S 江西 55 29 内蒙古 30 20 河北 48 20 江苏 72.5 52.5 吉林 52 33 四川 67 55 就拿我们大河北来…

02强化学习基本概念

强化学习基本概念 前言1、State、Action、Policy等① State② Action③ State transition④ State transition probability⑤ Polity 2、Reward、Return、MDP等① Reward② Trajectory and return③ Discounted return④ Episode⑤ MDP 总结&#xff1a; 前言 本文来自西湖大学…

一、荔枝派nano启动USB虚拟串口功能FLASH版

一、搭建环境 本次使用的是ubuntu16.04进行搭建编译环境&#xff0c;具体的配置编译登都在荔枝派官网有介绍&#xff1a;https://wiki.sipeed.com/soft/Lichee/zh/Nano-Doc-Backup/build_sys/build_flash_copy.html 特别注意&#xff1a;本次需要使用的USB转串口功能&#xff0…

解决方案 | 如何构建市政综合管廊安全运行监测系统?

如何构建市政综合管廊安全运行监测系统&#xff1f;WITBEE万宾城市生命线智能监测仪器&#xff0c;5年免维护设计&#xff0c;集成10多项结构与气体健康监测指标&#xff0c;毫秒级快速响应&#xff0c;时刻感知综合管廊运行态势

【kafka】可视化工具KAFKA EAGLE安装分享

目录 准备&#xff1a; 开始&#xff1a; 1.解压 2.环境变量配置 3.生效环境变量配置文件 3.修改配置文件 1.修改zookeeper集群信息 2.修改mysql配置信息 4.启动 5.异常排查 6.页面 创作不易&#xff0c;你的动力是我创作的动力&#xff0c;如果有帮助请关注我&…

C 初级学习笔记(基础)

目录 1.预处理器指令 预定义宏 预处理器运算符 &#xff08;\&#xff09; 参数化的宏 头文件 .h 引用头文件操作 2.函数&#xff08;标识符&关键字&运算符&#xff09;存储类 函数参数 a. 标识符&关键字 b. 运算符&#xff08;算术、关系、逻辑、位、赋…

千巡翼X1 让航测无人机更小更轻更高效

利用无人机进行航空摄影测量&#xff0c;已成为测绘外业生产的主要方式&#xff0c;不仅方便快捷&#xff0c;更能全面准确获得成果。近年来&#xff0c;凭借快速高效、机动灵活、安全可靠、低成本等诸多优势&#xff0c;小型多旋翼无人机逐渐成为一些航测项目作业的新利器。 千…

方案:基于AI烟火识别与视频技术的秸秆焚烧智能化监控预警方案

一、方案背景 为严控秸秆露天焚烧&#xff0c;改善环境空气质量&#xff0c;各省相继发布秸秆禁烧工作内容。以安徽省为例&#xff0c;大气污染防治联席会议下发了该省2020年秸秆禁烧工作部署通知。2020年起&#xff0c;气象局将对全省秸秆焚烧火点实施卫星全年全时段监测&…

C语言入门Day_24 函数与指针

目录 前言&#xff1a; 1.指针和数组 2.函数和指针 3.易错点 4.思维导图 前言&#xff1a; 我们知道数组是用来存储多个数据的&#xff0c;以及我们可以用指针来指向一个变量。那么我们可以用指针来指向一个数组中的数据么&#xff1f; 指针除了可以像指向一个变量一样指…

三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析

三维模型3DTile格式轻量化压缩处理的数据质量提升方法分析 在处理三维模型3DTile格式的轻量化压缩时&#xff0c;如何在减少数据量的同时&#xff0c;保证或提升数据质量是一大挑战。以下为一些提升数据质量的方法分析&#xff1a; 改进几何简化算法&#xff1a;在进行几何简化…

centos 7.9系统安装向日葵

1.下载地址 向日葵远程控制app官方下载 - 贝锐向日葵官网 2.下载依赖 yum install -y libappindicator-gtk3 安装好依赖之后&#xff0c;然后再安装向日葵软件 3.安装软件 sudo rpm -ivh 文件名.rpm 4.安装成功之后的位置

python脚本批量创建数据

背景 批量创建测试数据&#xff0c;利用python自带的库如faker库&#xff0c;节省大量的人工。准备工作 1、安装python&#xff0c;参考地址 https://www.runoob.com/python3/python3-install.html 2、设置环境变量(不同操作系统) PATH“$PATH:/usr/local/bin/python” 3、查…