C++20: 像Python一样逐行读取文本文件并支持切片操作

news2024/12/26 6:09:20

概要

逐行读取文本文件,并提取其中连续的几行,这对于 Python 来说是小菜一碟。 C++ 则很笨拙, 语言不自带这些。 这次我来拯救 C++ boys & girls, 在 C++20 环境下,山寨一个 Python 下的逐行读文本文件、支持 slice 操作的代码,包含基础设施的实现和调用实例代码。

问题是什么?

data.csv

0,11,336,23,370
0,5,370,16,404
1,370,404,410,419
1,435,376,444,402
2,249,409,280,446
2,579,441,632,472
filepath = "data.csv"

with open(filepath, "r") as f:
    # print('type(f):', type(f))
    lines = f.readlines()
    for line in lines[1:3]:
        print(line.strip())

    print('---')

    for line in lines[3:]:
        print(line.strip())

对于上述文本文件和 Python 代码, 用 C++20 实现一个等效的代码:

  • 基础设施代码,不限制行数
  • 调用代码,尽可能和 Python 代码长得像, 比如都是10行以内,切片操作也尽可能的直观

逐行读取文件 - C++ 实现

这个功能比较好实现,返回 vector 就可以了。文件读取使用的是 std::fstream,基于 RAII 思想创建和释放。对于每一行文本的读取,使用 std::getline() 来完成。

#include <fstream>
#include <vector>
#include <string>

class TextIOWrapper
{
public:
    TextIOWrapper(const std::string& filepath)
    {
        ifs.open(filepath);
    }

    ~TextIOWrapper()
    {
        ifs.close();
    }

    std::string readline()
    {
        std::string line;
        std::getline(ifs, line);
        return line;
    }

    std::vector<std::string> readlines()
    {
        std::vector<std::string> lines;
        std::string line;
        while (std::getline(ifs, line))
        {
            lines.emplace_back(line);
        }
        return lines;
    }

private:
    std::ifstream ifs;
};

切片操作 - 基于C++20的实现

对于切片操作: Python 中的 [start:end], C++ 里并不支持; std::ranges 使用的管道操作符 |,可以用作这个目的。

std::ranges 笨拙的地方在于,只提供了 std::ranges::views::drop(start)std::ranges::views::take(end-start) 这样的基础操作,从来不考虑调用者用起来多费劲。。。那么我们自行封装一个:


namespace views {
    auto slice(size_t start, size_t end) {
        return std::ranges::views::drop(start) | std::ranges::views::take(end - start);
    }
    auto slice(size_t start) {
        return std::ranges::views::drop(start);
    }
}

调用代码 - C++

在这里插入图片描述

#include <iostream>

int main()
{
    const std::string filepath = "data.csv";
    TextIOWrapper fin(filepath);

    auto lines = fin.readlines();

    for (auto line : lines | views::slice(1, 3))
    {
        std::cout << line << std::endl;
    }

    printf("---\n");

    for (auto line : lines | views::slice(3))
    {
        std::cout << line << std::endl;
    }

    return 0;
}

完整代码

https://github.com/zchrissirhcz/clumsy/commit/9273ccaf50c31a5b0c2190713dd696c7d0d200f4

总结

本文从简洁的 Python 读取文本文件和切片的代码出发,以相同简洁的调用代码为目标,使用常规的 C++ 封装方式实现了返回文件所有行或单独一行的操作;然后基于 C++20 的 std::ranges 实现了类似 Python 中的切片操作, 并给出了示例代码来展示正确性。

参考

https://stackoverflow.com/questions/50549611/slicing-a-vector-in-c

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

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

相关文章

【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化?

【NLP高频面题 - LLM架构篇】LLM对Transformer都有哪些优化&#xff1f; ⚠︎ 重要性&#xff1a;★★★ &#x1f4af; NLP Github 项目&#xff1a; NLP 项目实践&#xff1a;fasterai/nlp-project-practice 介绍&#xff1a;该仓库围绕着 NLP 任务模型的设计、训练、优化、…

电脑还原重置Windows系统不同操作模式

电脑有问题,遇事不决就重启,一切都不是问题!是真的这样吗。其实不然,主机系统重启确实可以自动修复一些文件错误,或者是设置问题,但是,当你由于安装了错误的驱动或者中毒严重,亦或是蓝屏,那么重启这个方子可能就治不了你的电脑了。 那么,除了当主机出现异常故障现象…

深度学习模型: BERT(Bidirectional Encoder Representations from Transformers)详解

一、引言 自然语言处理&#xff08;NLP&#xff09;领域在过去几十年取得了显著的进展。从早期基于规则的方法到统计机器学习方法&#xff0c;再到如今基于深度学习的模型&#xff0c;NLP 不断向着更高的准确性和效率迈进。BERT 的出现为 NLP 带来了新的突破&#xff0c;它能够…

亚马逊开发视频人工智能模型,The Information 报道

根据《The Information》周三的报道&#xff0c;电子商务巨头亚马逊&#xff08;AMZN&#xff09;已开发出一种新的生成式人工智能&#xff08;AI&#xff09;&#xff0c;不仅能处理文本&#xff0c;还能处理图片和视频&#xff0c;从而减少对人工智能初创公司Anthropic的依赖…

LLM学习笔记(13)分词器 tokenizer

由于神经网络模型不能直接处理文本&#xff0c;因此我们需要先将文本转换为数字&#xff0c;这个过程被称为编码 (Encoding)&#xff0c;其包含两个步骤&#xff1a; 使用分词器 (tokenizer) 将文本按词、子词、字符切分为 tokens&#xff1b;将所有的 token 映射到对应的 tok…

通过LabVIEW项目判断开发环境是否正版

在接收或分析他人提供的LabVIEW项目时&#xff0c;判断其开发环境是否为正版软件对于保护知识产权和避免使用非法软件至关重要。本文将详细介绍如何通过项目文件、可执行程序及开发环境信息判断LabVIEW是否为正版。 ​ 1. 从项目文件判断 LabVIEW项目的源码&#xff08;VI 文件…

node.js基础学习-url模块-url地址处理(二)

前言 前面我们创建了一个HTTP服务器&#xff0c;如果只是简单的http://localhost:3000/about这种链接我们是可以处理的&#xff0c;但是实际运用中一般链接都会带参数&#xff0c;这样的话如果我们只是简单的判断链接来分配数据&#xff0c;就会报404找不到链接。为了解决这个问…

思科网络设备常用命令整理

思科网络设备的配置命令非常丰富&#xff0c;广泛应用于路由器、交换机和其他网络设备的管理与配置。以下是一些常见的思科设备配置命令&#xff0c;按照功能分类&#xff0c;以帮助你快速查找和使用。 一、基本命令 查看当前配置和状态 show running-config&#xff1a;查看…

2024年信号处理与神经网络应用(SPNNA 2024)

会议官网&#xff1a;www.spnna.org 会议时间&#xff1a;2024年12月13-15日 会议地点&#xff1a;中国武汉

Leecode经典题3-删除排序数组中的重复项

删除排序数组中的重复项 题目描述&#xff1a; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 …

无人机数据处理系统:原理与核心系统

一、数据处理系统的运行原理 数据获取&#xff1a;无人机在飞行过程中&#xff0c;通过搭载的传感器&#xff08;如相机、激光雷达等&#xff09;采集到各种类型的数据&#xff0c;例如图像、点云等。这些数据是后续处理和分析的基础。 数据传输&#xff1a;采集到的数据会通…

ElasticSearch学习篇19_《检索技术核心20讲》搜推广系统设计思想

目录 主要是包含搜推广系统的基本模块简单介绍&#xff0c;另有一些流程、设计思想的分析。 搜索引擎 基本模块检索流程 查询分析查询纠错 广告引擎 基于标签倒排索引召回基于向量ANN检索召回打分机制&#xff1a;非精确打分精准深度学习模型打分索引精简&#xff1a;必要的…

【尚筹网】五、管理员维护

【尚筹网】五、管理员维护 任务清单分页管理管理员信息目标思路代码引入 PageHelperAdminMapper 中编写 SQL 语句AdminMapper 接口生成方法AdminServiceAdminHandler页面显示主体在页面上使用 Pagination 实现导航条 关键词查询页面上调整表单在翻页时保持关键词查询条件 单条删…

MySQL 启动失败问题分析与解决方案:`mysqld.service failed to run ‘start-pre‘ task`

目录 前言1. 问题背景2. 错误分析2.1 错误信息详解2.2 可能原因 3. 问题排查与解决方案3.1 检查 MySQL 错误日志3.2 验证 MySQL 配置文件3.3 检查文件和目录权限3.4 手动启动 MySQL 服务3.5 修复 systemd 配置文件3.6 验证依赖环境 4. 进一步优化与自动化处理结语 前言 在日常…

Apache storm UI如何更换默认8080端口

在搭建Apache storm环境的时候&#xff0c;遇到Apache storm UI默认端口是8080&#xff0c;但是这个端口会被其他java程序占用&#xff0c;导致Apache storm UI服务无法启动。报错Exception in thread “main” java.lang.RuntimeException: java.io.IOException: Failed to bi…

FPGA实现串口升级及MultiBoot(十)串口升级SPI FLASH实现

本文目录索引 工程架构example9工程设计Vivado设计Vitis设计example9工程验证1、读取FLASH ID2、擦除整个FLASH3、Blank-Check4、烧写Golden区位流5、读取FLASH内容6、烧写MultiBoot区位流(升级位流)7、MultiBoot区位流(升级位流)启动example10工程设计Vivado设计Vitis设计exam…

图解人工智能:从规则到深度学习的全景解析

&#x1f31f;作者简介&#xff1a;热爱数据分析&#xff0c;学习Python、Stata、SPSS等统计语言的小高同学~&#x1f34a;个人主页&#xff1a;小高要坚强的博客&#x1f353;当前专栏&#xff1a;Python之机器学习&#x1f34e;本文内容&#xff1a;图解人工智能&#xff1a;…

Binder架构

一、架构 如上图&#xff0c;binder 分为用户层和驱动层两部分&#xff0c;用户层有客户端&#xff08;Client&#xff09;、服务端&#xff08;Server&#xff09;、服务管理&#xff08;ServiceManager&#xff09;。 从用户空间的角度&#xff0c;使用步骤如下&#xff08;…

基于springboot中小型制造企业质量管理系统源码和论文

信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古以来的…

Flutter 权限申请

这篇文章是基于permission_handler 10.2.0版本写的 前言 在App开发过程中我们经常要用到各种权限&#xff0c;我是用的是permission_handler包来实现权限控制的。 pub地址&#xff1a;https://pub.dev/packages/permission_handler permission_handler 权限列表 变量 Androi…