Linux MyFile

news/2024/5/18 22:52:49/文章来源:https://blog.csdn.net/fengjunziya/article/details/132909931

在之前,我们应该都多少接触过了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.luyixian.cn/news_show_550424.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

故障注入实验:了解如何使用Chaos Engineering的方法,在服务网格中进行故障注入实验

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

输入框自动保留2位小数

<template><div class"box"><el-form :model"form" :rules"rules" ref"form" label-width"120px"><el-form-item label"保留2位小数" prop"aaa"><!-- v-numberInt自定义的指…

Linux学习-Redis主从和哨兵

主从复制 一主一从结构 # 配置host61为主服务器 [roothost61 ~]# yum -y install redis [roothost61 ~]# vim /etc/redis.conf bind 192.168.88.61 #设置服务使用的Ip地址 port 6379 #设置服务使用的端口号 使用默认端口即可 [roothost61 ~]# systemctl start redis [rooth…

三、开发工具

开发工具 开发工具1.1.熟悉IDEA1.2.下载IDEA1.3.IDEA中文插件1.4.IDEA输出中文乱码1.5.使用IDEA —————————————————————————————————————————————————— —————————————————————————————————…

国内低代码开发平台有哪些?低代码真的好用吗?

“低代码”这一概念在近几年异常火爆&#xff0c;也吸引了国内大厂纷纷加入&#xff0c;像腾讯、阿里、华为、网易、百度等科技巨头都自研了自己的低代码产品&#xff0c;并同时在该领域投资了不少厂商。就比如阿里&#xff0c;其先是在2018年投资了一家低代码平台&#xff0c;…

C语言指针,深度长文全面讲解

指针对于C来说太重要。然而&#xff0c;想要全面理解指针&#xff0c;除了要对C语言有熟练的掌握外&#xff0c;还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。 为什么需要指针&#xff1f; 指针解决了一些编程中基本的问题。…

嵌入式和 Java 走哪条路?

今日话题&#xff0c;嵌入式和 Java 走哪条路?嵌入式对软件感兴趣&#xff0c;走java嵌入式行业薪资并不算低&#xff0c;比上不足&#xff0c;比下有余。特别是从2020年开始&#xff0c;嵌入式也借上了芯片行业的东风火了起来。能拿多少薪资&#xff0c;受多方面因素影响。下…

激光焊接汽车PP塑料配件透光率测试仪

随着汽车主机厂对车辆轻量化的需求越来越强烈&#xff0c;汽车零部件轻量化设计、制造也成为汽车零部件生产厂商的重要技术指标。零部件企业要实现产品的轻量化&#xff0c;在材料指定的情况下&#xff0c;要通过产品设计优化、产品壁厚减小和装配方式的优化来解决。使用PP材料…

服务网格的面临挑战:探讨服务网格实施中可能遇到的问题和解决方案

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【案例教学】华为云API图引擎服务 GES的便捷性—AI帮助快速处理图片小助手

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;人工智能AI快速处理图片 1 IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE&#xff0c;基于华为云服务提供…

Java8 Stream 数据流,大数据量下的性能效率

Stream 是 Java SE 8 类库中新增的关键抽象&#xff0c;它被定义于 java.util.stream &#xff08;这个包里有若干流类型&#xff1a; Stream<T> 代表对象引用流&#xff0c;此外还有一系列特化流&#xff0c;如 IntStream&#xff0c;LongStream&#xff0c;DoubleStrea…

动画制作如何选择动作捕捉动画制作服务

近日&#xff0c;长宁ART PARK 大融城迎来了首位虚拟代言人“光艺”&#xff0c;拥有着极具感染力的笑容、数字人形象辨识度极高&#xff0c;在裸眼3D巨屏中&#xff0c;为市民带来虚实交互体验。而这种数字人动画的背后&#xff0c;大多以动作捕捉动画制作技术为主。 *素材源于…

LeetCode算法动态规划—剑指 Offer 10- II. 青蛙跳台阶问题

目录 剑指 Offer 10- II. 青蛙跳台阶问题 题解&#xff1a; 代码&#xff1a; 运行结果&#xff1a;​编辑 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97&#xff08;1000000007&#xff…

MATLAB APP纯小白入门 两数相加

万事开头难&#xff0c;最怕第一次。使用matlab APP 实现两数求和&#xff0c;如下图所示&#xff0c;c a b&#xff0c;输入数字后&#xff0c;按 “” 就计算。 步骤 拖拽三个 Edit Field(Numeric) 过来&#xff0c;并且双击名字分别改为 a,b,c。注意修改名字后右边会有点变…

Python日志处理器,同时打印到控制台和保存到文件中,并保证格式一致

使用logging模块的时候&#xff0c;默认是输出到控制台的&#xff0c;当然也可以配置输出到文件中&#xff0c;但是当你配置了文件后&#xff0c;控制台的输出就消失了&#xff0c;所以&#xff0c;需要一个策略即能保存到文件中&#xff0c;又能输出到控制台中。 下面是我做的…

【计算机毕业设计】基于SpringBoot+Vue的流浪猫狗救助救援网站的设计与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…

求链表的倒数第k个节点

思路&#xff1a;利用快慢指针空间差 代码&#xff1a; struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {// write code herestruct ListNode* slow pListHead;struct ListNode* fast pListHead;while(k--){if(fastNULL){return NULL;}fastfast->…

linux常用命令(4):mkdir命令(创建目录)

文章目录 一、命令简介二、命令格式三、常用示例 一、命令简介 mkdir&#xff08;make directories&#xff09;创建目录。 若指定目录不存在则创建目录。若指定目录已存在&#xff0c;则会提示已存在而不继续创建。 touch与mkdir的区别? 很多人可能会把这个搞混淆&#xff…

主动写入流对@ResponseBody注解的影响 | 京东云技术团队

问题回溯 2023年Q2某日运营反馈一个问题&#xff0c;商品系统商家中心某批量工具模板无法下载&#xff0c;导致功能无法使用&#xff08;因为模板是动态变化的&#xff09; 商家中心报错&#xff08;JSON串&#xff09;&#xff1a; {"code":-1,"msg":&…

如何成为一名“受欢迎”的数据科学家和机器学习工程师

《机器学习项目交付实战》将介绍如何从模型和数据中获取最佳性能&#xff0c;帮助你构建稳定的数据管道。通过高效的可复用技术集合&#xff0c;来确保应用程序工作流程的顺利执行&#xff0c;以及提高模型的可维护性。基于数十年的良好软件工程实践&#xff0c;机器学习工程可…