当前位置: 首页 > news >正文

Linux 简单模拟实现C语言文件流

🌇前言

在 C语言 的文件流中,存在一个 FILE 结构体类型,其中包含了文件的诸多读写信息以及重要的文件描述符 fd,在此类型之上,诞生了 C语言 文件相关操作,如 fopenfclosefwrite 等,这些函数本质上都是对系统调用的封装,因此我们可以根据系统调用和缓冲区相关知识,模拟实现出一个简单的 C语言 文件流。

 注意: 本文实现的只是一个简单的 demo,重点在于理解系统调用及缓冲区

🏙️正文

1、FILE 结构设计

在设计 FILE 结构体前,首先要清楚 FILE 中有自己的缓冲区及冲刷方式

 

// 数据读取
size_t my_fread(void *ptr, size_t size, size_t nmemb, MY_FILE *stream)
{// 数据读取前,需要先把缓冲区刷新if (stream->_current > 0)my_fflush(stream);size_t user_size = size * nmemb;size_t my_size = BUFFER_SIZE;// 先将数据读取到FILE缓冲区中,再赋给 ptrif (my_size >= user_size){// 此时缓冲区中足够存储用户需要的所有数据,只需要读取一次read(stream->_fd, stream->_buffer, my_size);memcpy(ptr, stream->_buffer, my_size);*((char *)ptr + my_size - 1) = '\0';}else{int ret = 1;size_t tmp = user_size;while (ret){// 一次读不完,需要多读取几次ret = read(stream->_fd, stream->_buffer, my_size);stream->_buffer[ret] = '\0';memcpy(ptr + (tmp - user_size), stream->_buffer, my_size);stream->_current = 0;user_size -= my_size;}}size_t readn = strlen(ptr);return readn;
}

 

相关文章:

  • 剑指offer13_剪绳子
  • [Protobuf]常见数据类型以及使用注意事项
  • MacroDroid安卓版:自动化操作,让生活更智能
  • Android第十一次面试补充篇
  • 力扣题解106:从中序与后序遍历序列构造二叉树
  • 雪花算法:分布式ID生成的优雅解决方案
  • LINUX 61 rsync定时同步;软链接
  • RAGflow详解及实战指南
  • 《C++初阶之入门基础》【C++的前世今生】
  • C++命名空间深度解析
  • 功能丰富的PDF处理免费软件推荐
  • 如何实现告警的自动化响应?
  • Java求职者面试题详解:Spring、Spring Boot、MyBatis技术栈
  • PyTorch——DataLoader的使用
  • Java八股文智能体——Agent提示词(Prompt)
  • IDEA,Spring Boot,类路径
  • 论文阅读(六)Open Set Video HOI detection from Action-centric Chain-of-Look Prompting
  • Linux 学习-模拟实现【简易版bash】
  • 从单机到集群,再到分布式,再到微服务
  • Java String 详细教程
  • 网站登录页面空白/地推接单平台找推网
  • 人气最高的网络游戏排行榜/吉林seo外包
  • 自己做章网站/广告引流推广平台
  • 高端企业站/成都做网络推广的公司有哪些
  • 赤壁网站建设/2024年的新闻时事热点论文
  • 海口网站制作公司/百度seo排名优化联系方式