Linux MyFile

news2024/9/23 23:26:04

在之前,我们应该都多少接触过了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 degug
      printf("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.coloradmin.cn/o/1012914.html

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

相关文章

组合拳SSRF+redis未授权访问

目录 一、SSRF 二、redis未授权访问 三、组合利用 1.写入Webshell 2.反弹shell 一、SSRF 一台web服务器对其他服务器发起请求&#xff0c;以加载其他服务器的web内容或数据 但因请求参数没有进行严格过滤&#xff0c;攻击者可能会通过SSRF漏洞来访问敏感数据、执行未经授…

Deformable Convolution 可变形卷积

论文&#xff1a;https://openaccess.thecvf.com/content_ICCV_2017/papers/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.pdf 代码&#xff1a;https://github.com/4uiiurz1/pytorch-deform-conv-v2/blob/master/deform_conv_v2.py 参考博文&#xff1a;可变形卷…

【哈希加密算法】MD5和SHA-1基本介绍和使用!

一、哈希算法 哈希算法&#xff0c;根据碰撞概率&#xff0c;输出的长度越长&#xff0c;就越难产生碰撞&#xff0c;也就越安全。 常用的哈希算法如下&#xff1a; &#xff08;1&#xff09;哈希算法的用途 数据加密&#xff1a;哈希算法可以将原始数据转换成不可逆的加密字…

第二章:25+ Python 数据操作教程(第二十一节PIP连接错误:SSL 证书验证失败解决办法)

在公司网络中安装 python 包时最常见的问题是 SSL 证书验证失败。有时公司会屏蔽网络中的某些网站&#xff0c;因此员工无法访问这些网站。每当他们尝试访问这些网站时&#xff0c;都会显示“由于公司政策&#xff0c;访问被拒绝”。它会导致到达主要 python 网站时出现连接错误…

(面试经典刷题)挑战一周刷完150道-Python版本-第3天(40个题)-I(前10个题)

一、长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 可以是暴…

数据结构与算法(C语言版)P1---算法效率

算法的效率&#xff1a;算法的时间复杂度和空间复杂度 【本节目标】 1.算法效率2.时间复杂度3.空间复杂度4.常见时间复杂度以及复杂oj练习 1、算法效率 1.1、如何衡量一个算法是的好坏 如何衡量一个算法的好坏呢&#xff1f;比如斐波那契数列&#xff1a; long long Fib(…

面试官:我们深入聊聊Java虚拟机吧

哈喽&#xff01;大家好&#xff0c;我是奇哥&#xff0c;一位专门给面试官添堵的职业面试员 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff01; 文章目录 前言面试Java虚拟机内存模型垃圾收集器…

2023年CRM系统成功落地的5个标准

企业做CRM选型时都在思考投入产出比&#xff0c;花费上万元、甚至几十万元和几个月的时间购买和实施CRM&#xff0c;能否为公司带来降本增效的变革&#xff1f;CRM上线后&#xff0c;需要多长时间才能真切地看到效果&#xff1f;评估CRM的使用效果&#xff0c;需要每个企业制定…

【C++STL基础入门】queue基础使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、队列是什么二、queue的基础使用2.1 queue的构造函数2.2 queue的属性函数 总结 前言 C标准模板库&#xff08;STL&#xff09;提供了一系列强大的容器和算法…

vi/vim编辑器

vi和vim区别 vi 和 vim 是常见的文本编辑器&#xff0c;以下是它们之间的区别&#xff1a; 功能和特性&#xff1a; vi 是最早的版本&#xff0c;是在早期Unix系统中广泛使用的编辑器。vi 相对较简单&#xff0c;功能主要集中在基本的文本编辑操作上&#xff0c;如插入、删除、…

MyBatis: 配置文件解析流程

XmlConfigurationBuilder类来解析配置文件。 调用了build方法&#xff0c;其代码如下&#xff1a; 其中通过parse方法返回一个Configuration对象&#xff0c;在传递给build方法。 parse方法代码如下&#xff1a; 其中调用了parseConfiguration方法&#xff0c; 可以看到其中…

hive 静态分区与动态分区(笔记)

目录 前言&#xff1a; 静态分区&#xff1a; 1.创建分区 2.删除分区 3.在分区中插入数据 4.查看分区表数据 动态分区 &#xff1a; 2.查看v表源数据 3.以emp_name为动态字段数据抽取到employee表 总结 前言&#xff1a; Hive中的分区就是把一张大表的数据按照业务需要…

华为云云耀云服务器L实例评测|华为云上安装监控服务Prometheus三件套安装

文章目录 华为云云耀云服务器L实例评测&#xff5c;华为云上试用监控服务Prometheus一、监控服务Prometheus三件套介绍二、华为云主机准备三、Prometheus安装四、Grafana安装五、alertmanager安装六、三个服务的启停管理1. Prometheus、Alertmanager 和 Grafana 启动顺序2. 使用…

ChatGPT与日本首相交流核废水事件-精准Prompt...

了解更多请点击&#xff1a;ChatGPT与日本首相交流核废水事件-精准Prompt...https://mp.weixin.qq.com/s?__bizMzg2NDY3NjY5NA&mid2247490070&idx1&snebdc608acd419bb3e71ca46acee04890&chksmce64e42ff9136d39743d16059e2c9509cc799a7b15e8f4d4f71caa25968554…

UG时的弹出框:提示没有可用许可证,No such feature exists(-5),

当过多用户使用UG时或UG优化失效时会出现此弹出框。如果该问题发生时&#xff0c;需立即联系管理员&#xff0c;查看许可管理平台&#xff0c;该服务器许可是否占满&#xff0c;如果占满&#xff0c;联系武汉格发管理员&#xff0c;请准备好服务器远程&#xff0c;可以及时查看…

NLP(5)--自编码器

目录 一、自编码器 1、自编码器概述 2、降噪自编码器 二、特征分离 三、自编码器的其他应用 1、文本生成 2、图像压缩 3、异常检测 四、VAE 1、极大似然估计 2、GSM 3、GMM 4、VAE的引出 5、VAE 一、自编码器 1、自编码器概述 自编码器&#xff08;Auto-Encode…

【高阶数据结构】AVL树(C++实现)

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C进阶 ⭐代码仓库&#xff1a;C进阶 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们的支持是我…

如何将一个字符串转换为驼峰命名法(camel case)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 思路⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领…

ODrive移植keil(三)—— USB虚拟串口和快速正弦余弦运算

目录 一、USB虚拟串口1.1、硬件连接1.2、代码移植1.3、测试1.4、最终代码 二、快速正弦余弦运算2.1、硬件连接2.2、代码移植2.3、测试2.4、结论 三、软件中断3.1、配置中断3.2、官方代码的使用方式 ODrive、VESC和SimpleFOC 教程链接汇总&#xff1a;请点击 一、USB虚拟串口 单…

Pdf文件签名检查

如何检查pdf的签名 首先这里有一个已经签名的pdf文件&#xff0c;通过pdf软件可以看到文件的数字签名。 下面就是如何代码检查这里pdf文件的签名 1.引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId&g…