2407C++,跨平台读写文件

原文

C++文件操作这一块比较混乱,可用std::fstream去读写文件,也可用fread/fwrite去读写文件,linux平台上还可用pread/pwrite去读写文件.

除此外,linux平台还可io_uring去读写文件,窗口平台则iocp去读写文件.

这些文件操作的api各不相同,有时不知道选择哪个接口更好,如果有一个统一的文件操作接口那就好了,统一的api去操作文件,操作方式包括上述这些读写方式.

如何设计一个统一的文件操作库

文件操作读写方式上分类可分为两类,一个是顺序读写,一个是随机读写,清理一下这些文件操作方式:

文件顺序读写:

fstream.read/write;
fread/fwrite;

linux,io_uring顺序读写;
窗口,iocp顺序读写

文件随机读写:

windows ReadFile/WriteFile;
linux pread/pwrite;

linux,io_uring随机读写;
窗口,iocp随机读写

再从另外一个维度分类,同步读写和异步读写:

同步读写:

fstream.read/write;
2.fread/fwrite;
windows ReadFile/WriteFile;
2.linux pread/pwrite;

异步读写:

linux,io_uring读写;
窗口,iocp读写

统一起来似乎有点麻烦.可这样分类,无论是异步还是同步,读写本质都从属于顺序读写随机读写,因此可这样抽象:

文件分为两类,一类是顺序读写的文件,另外一类是随机读写的文件,这两类文件都支持同步读写和异步读写.

但是,还有个问题,文件同步操作阻塞当前线程,很多时候不想阻塞,此时可把同步读写文件的任务交给线程池,并提供一个异步读写接口,在C++20中当然是提供协程接口了.

io_uringiocp是提供真正异步文件接口的本地异步,而fstream,fread,pread这些同步接口需要放到线程池中读写文件.

因此可提供一个统一协程读写接口,默认是会使用io_uring/iocp读写文件,也允许用户显式指定线程池方式读写文件.

最终统一的跨平台的文件操作库如下:

enum class execution_type { none, native_async, thread_pool };
template <execution_type execute_type = execution_type::native_async>
class basic_seq_coro_file {
public:
  async_simple::coro::Lazy<std::pair<std::error_code, size_t>> async_read(
      char *buf, size_t size);
  async_simple::coro::Lazy<std::pair<std::error_code, size_t>> async_write(
      std::string_view buf);
};

顺序文件读写来说,用户只需要定义basic_seq_coro_file时,指定execution_type就可以了,默认为native_async,会通过io_uringiocp异步写文件,如果设置native_asyncthread_pool,则会在线程池中通过std::fstream顺序读写文件.

再来看看随机读写文件的类,也是类似的,只是多了一个偏移:

template <execution_type execute_type = execution_type::native_async>
class basic_random_coro_file {
 public:
  async_simple::coro::Lazy<std::pair<std::error_code, size_t>> async_read_at(
      uint64_t offset, char *buf, size_t size);
  async_simple::coro::Lazy<std::pair<std::error_code, size_t>> async_write_at(
      uint64_t offset, std::string_view buf);
};

默认io_uring/iocp异步读写文件,如果指定execute_typethread_pool方式,则会在线程池pread/ReadFile,pwrite/WriteFile随机读写文件.

如果嫌模板类定义太长了,可给个默认别名:

using coro_file = basic_seq_coro_file<>;
using random_coro_file = basic_random_coro_file<>;

这样用起来很方便了:

coro_file顺序读写文件

async_simple::coro::Lazy<void> seq_read(std::string filename) {
  coro_io::coro_file file{};
  file.open(filename, std::ios::in);
  CHECK(file.is_open());
  std::string str;
  str.resize(200);
  {
    auto pair = co_await file.async_read(str.data(), 10);
    CHECK(pair.second == 10);
    CHECK(!file.eof());
  }
  {
    bool ok = file.seek(10, std::ios::beg);
    CHECK(ok);
  }
  {
    auto pair = co_await file.async_read(str.data(), str.size());
    CHECK(pair.second == 5);
    CHECK(file.eof());
  }
}
async_simple::coro::Lazy<void> seq_write(std::string filename) {
  coro_io::coro_file file{};
  //创建一个可读可写的新文件
  file.open(filename, std::ios::in | std::ios::out | std::ios::trunc);
  CHECK(file.is_open());
  std::string str = "hello";
  co_await file.async_write(str);
  std::string result;
  result.resize(10);
  CHECK(file.seek(0, std::ios::beg));
  auto [rd_ec, size] = co_await file.async_read(result.data(), 5);
  std::string_view s(result.data(), size);
  CHECK(s == "hello");
}

这样默认就会通过io_uring/iocp异步读写文件,如果想在线程池中读写,则这样调用:

void test_seq_read_write(std::string_view filename) {
  create_files({std::string(filename)}, 190);
  coro_io::basic_seq_coro_file<coro_io::execution_type::thread_pool> file(filename, std::ios::in | std::ios::out);
  CHECK(file.is_open());
  char buf[100];
  std::error_code ec;
  size_t size;
  std::tie(ec, size) = async_simple::coro::syncAwait(file.async_read(buf, 10));
  CHECK(size == 10);
  std::string str = "test";
  std::tie(ec, size) = async_simple::coro::syncAwait(file.async_write(str));
  CHECK(size == 4);
}

接口简单易用,open接口和std::fstream打开方式一样,seek参数也是一样,免去了重新学习api的负担.

coro_file随机读写文件

void test_random_read_write(std::string_view filename) {
  create_files({std::string(filename)}, 190);
  random_coro_fil file(filename, std::ios::in);
  CHECK(file.is_open());
  char buf[100];
  auto pair = async_simple::coro::syncAwait(file.async_read_at(0, buf, 10));
  CHECK(std::string_view(buf, pair.second) == "AAAAAAAAAA");
  CHECK(!file.eof());
  coro_io::basic_random_coro_file<execute_type> file1;
  file1.open(filename, std::ios::out);
  CHECK(file1.is_open());
  std::string buf1 = "cccccccccc";
  async_simple::coro::syncAwait(file1.async_write_at(0, buf1));
  std::string buf2 = "dddddddddd";
  async_simple::coro::syncAwait(file1.async_write_at(10, buf2));
}

coro_file在哪里?它就是yalantinglibs.coro_file:这里

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

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

相关文章

VuePress 的更多配置

现在&#xff0c;读者应该对 VuePress、主题和插件等有了基本的认识&#xff0c;除了插件&#xff0c;VuePress 自身也有很多有用的配置&#xff0c;这里简单说明下。 ‍ ‍ VuePress 的介绍 在介绍了 VuePress 的基本使用、主题和插件的概念之后&#xff0c;我们再来看看官…

Oracle RAC 19c 打补丁至最新版本-19.23.0.0.0

实验环境-我是从19.0.0.0直接打到19.23.0.0.0&#xff0c;适合刚部署好的集群打补丁直接到最新版本。 查看当前环境 查询集群中运行的 Oracle Clusterware 软件的 activex 版 查询本地节点上二进制文件中存储的 Oracle Clusterware 软件的版本 查询本地服务器上 OHAS 和 Oracle…

windows无法访问github

##一、如果发现windows无法访问github时 一般就是我们的dns出现了问题&#xff0c;此时我们需要更换一个dns访问 ##二、解决方法 首先我们访问ip查询地址&#xff0c; https://ipchaxun.com/github.com/ 可更换下面历史ip进行测试&#xff0c;在windows的cmd里面输入ping git…

【C++】开源:命令行解析库CLI11配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍命令行解析库CLI11配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#x…

苹果清理软件:让你的设备焕然一新

随着时间的推移&#xff0c;无论是Mac电脑还是iOS设备&#xff0c;都可能会因为积累的垃圾文件、缓存、未使用的应用和其他冗余数据而开始表现出性能下降。这不仅会占用宝贵的存储空间&#xff0c;还可能影响设备的响应速度和电池寿命。幸运的是&#xff0c;有多种苹果清理软件…

Zabbix监控软件

目录 一、什么是Zabbix 二、zabbix监控原理 三、zabbix 安装步骤 一、什么是Zabbix ●zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 ●zabbix 能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的…

使用labelme中的AI多边形(AI-polygon)标注 win版exe Create AI-Polygon闪退

这里写目录标题 虚拟环境创建labelme虚拟环境下载AI标注模型win Labelme.exe Create AI-Polygon闪退问题也用如下方法解决 win Labelme.exe Create AI-Polygon闪退问题也用如下方法解决愉快地使用labelme的AI标注工具 虚拟环境 创建labelme虚拟环境 创建基础环境并激活 cond…

2007-2022年 国内各上市公司绿色化转型数据.(Excel文件、dta文件、参考文献、计算方法与说明)

上市公司绿色化转型数据为研究者提供了评估企业在生态文明建设、循环经济和绿色管理方面表现的重要视角。以下是对中国各上市公司绿色化转型数据的介绍&#xff1a; 数据简介 定义&#xff1a;上市公司绿色化转型是指企业在发展模式上向可持续发展转变&#xff0c;实现资源节…

摸鱼大数据——Spark SQL——基本介绍和入门案例

Spark SQL 基本介绍 1、什么是Spark SQL Spark SQL是Spark多种组件中其中一个&#xff0c;主要是用于处理大规模的【结构化数据】 什么是结构化数据: 一份数据, 每一行都有固定的列, 每一列的类型都是一致的 我们将这样的数据称为结构化的数据例如: mysql的表数据1 张三 202 …

hid-ft260驱动学习笔记 1 - 驱动模块注册与注销

目录 1. ft260_driver_init初始化 1.1 tty设备 1.1.1 申请tty驱动设备 1.1.2 初始化tty驱动程序 1.1.3 注册tty设备 1.2 hid设备 2. ft260_driver_exit注销模块 3. 调试 hid-ft260.c的最底部可以看到该驱动的注册与注销接口的申明。 module_init(ft260_driver_init); …

【基于R语言群体遗传学】-8-代际及时间推移对于变异的影响

上一篇博客&#xff0c;我们学习了在非选择下&#xff0c;以二项分布模拟遗传漂变的过程&#xff1a;【基于R语言群体遗传学】-7-遗传变异&#xff08;genetic variation&#xff09;-CSDN博客 那么我们之前有在代际之间去模拟&#xff0c;那么我们就想知道&#xff0c;遗传变…

LabVIEW透视变换

透视变换概述源程序在www.bjcyck.com下载 透视变换是一种几何变换&#xff0c;用于对图像进行扭曲&#xff0c;使其看起来从不同角度拍摄。这在计算机视觉和图像处理领域非常重要&#xff0c;例如在投影校正和图像配准中。LabVIEW提供了强大的图像处理工具&#xff0c;利用其V…

java生成json格式文件(包含缩进等格式)

生成json文件的同时保留原json格式&#xff0c;拥有良好的格式&#xff08;如缩进等&#xff09;&#xff0c;提供友善阅读支持。 pom.xml依赖增加&#xff1a; <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactI…

LabVIEW在图像处理中的应用

abVIEW作为一种图形化编程环境&#xff0c;不仅在数据采集和仪器控制领域表现出色&#xff0c;还在图像处理方面具有强大的功能。借助其Vision Development Module&#xff0c;LabVIEW提供了丰富的图像处理工具&#xff0c;广泛应用于工业检测、医学影像、自动化控制等多个领域…

Linux防火墙使用(firewalld与iptables)

防火墙概述 防火墙是一种由硬件和软件组合而成&#xff0c;在内部网和外部网之间、专有网和公共网之间构造的保护屏障&#xff0c;用以保护用户资料和信息安全的一种技术 防火墙作用在于及时发现并处理计算机网络运行时可能存在的安全风险、数据传输等问题&#xff0c;从而实现…

Java | Leetcode Java题解之第212题单词搜索II

题目&#xff1a; 题解&#xff1a; class Solution {int[][] dirs {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};public List<String> findWords(char[][] board, String[] words) {Trie trie new Trie();for (String word : words) {trie.insert(word);}Set<String> a…

Apache Seata Mac下的Seata Demo环境搭建

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Mac下的Seata Demo环境搭建&#xff08;AT模式&#xff09; 前言 最近因为工作需要&#xf…

探讨3D沉浸式在线会议系统的研发 - Meta演示的元宇宙虚拟化身多人对话场景,Web端现在也可以实现了 !

要实现一个元宇宙多人会议系统&#xff0c;关键技术有&#xff1a; 1. 3D虚拟空间的构建&#xff08;含光影特效、虚拟现实和增强现实&#xff09; 2. 3D虚拟化身的构建&#xff08;含动画、表情、语音&#xff09; 3. 多人角色管理 4. 会话控制和信息同步 5. 语音合成 6…

免费的鼠标连点器电脑版教程!官方正版!专业鼠标连点器用户分享教程!2024最新

电脑技术的不断发展&#xff0c;许多用户在日常工作和娱乐中&#xff0c;需要用到各种辅助工具来提升效率或简化操作&#xff0c;而电脑办公中&#xff0c;鼠标连点器作为一种能够模拟鼠标点击的软件&#xff0c;受到了广大用户的青睐。本文将为大家介绍一款官方正版的免费鼠标…

对接海康sdk-linux下复制jar包中resource目录的文件夹

背景 在集成海康sdk时,需要将一些组件放到项目中作为静态资源,并且海康的sdk初始化也需要加载这些静态资源,在windows下,使用一些File路径的方式是可以正确加载的,但是在linux上就会加载失败。 首先我是将海康的sdk组件放到resource下的,并且按照windows和linux设置了两…