C++/Python文件读写

2023-05-16

C++

为了方便开发,写了一个文本读写程序,能够读写二进制/文本格式的文件,程序只由一个头文件组成,可以很方便地加入到现有程序。完整程序如下:

#ifndef FILE_HELPER_HPP
#define FILE_HELPER_HPP

#include <fstream>
#include <memory>

// FileWriter //
class FileWriter{
public:
    FileWriter(const std::string& file_name){
        file_.open(file_name, std::ios::out);
    }
    ~FileWriter(){
        file_.close();
    }
    void write_txt(const std::string& str){
        file_ << str;
    }
    void write_bin(const char* bytes, size_t size){
        file_.write(bytes, size);
    }
    void close(){
        file_.close();
    }
    static std::shared_ptr<FileWriter> create(const std::string& file_name){
        return std::make_shared<FileWriter>(file_name);
    }

private:
    std::ofstream file_;
};
using FileWriterPtr = std::shared_ptr<FileWriter>;

// FileReader //
class FileReader{
public:
    enum{
        TXT = 0,
        BIN,
    };
public:
    FileReader(const std::string& file_name, int type){
        if(type == BIN)
            file_.open(file_name, std::ios::binary);
        else
            file_.open(file_name, std::ios::in);
    }
    ~FileReader(){
        file_.close();
    }
    void read_txt(double* buf, size_t size){
        for(size_t i = 0; i < size; ++i){
            file_ >> buf[i];
        }
    }
    char* read_bin(size_t size){
        auto bytes = new char[size];
        file_.read(bytes, size);
        return bytes;
    }
    void close(){
        file_.close();
    }
    static std::shared_ptr<FileReader> create(const std::string& file_name, int type = TXT){
        return std::make_shared<FileReader>(file_name, type);
    }
private:
    std::ifstream file_;
};
using FileReaderPtr = std::shared_ptr<FileReader>;

#endif // FILE_HELPER_HPP

测试程序

使用流程大致为:

  1. 定义数据格式结构体,在其中实现to_string()方法。实例化一个数据结构体
  2. 使用create方法创建一个FileReader/FileWriter实例,返回值是一个智能指针
  3. 按照指定格式调用读写函数,格式示例见测试程序

测试程序如下:

#include <iostream>
#include "file_helper.hpp"

struct Data{
    double x;
    double y;
    double z;
    inline std::string to_string(){
        return std::to_string(x) + " " + std::to_string(y) + " " + std::to_string(z) + "\n";
    }
};

int main(int argc, char** argv){

    Data data{1.0, 2.0, 3.0};

    /// Text ///

    FileWriterPtr writer_txt = FileWriter::create("test.txt");
    writer_txt->write_txt(data.to_string());
    writer_txt->close();

    FileReaderPtr reader_txt = FileReader::create("test.txt");
    Data data_txt;
    reader_txt->read_txt((double*)(&data_txt), sizeof(Data) / sizeof(double));
    std::cout << "文本文件读取结果  : " << std::endl; 
    std::cout << data_txt.to_string() << std::endl;

    /// Binary ///

    FileWriterPtr writer_bin = FileWriter::create("test.bin");
    writer_bin->write_bin((char*)(&data), sizeof(Data));
    writer_bin->close();

    FileReaderPtr reader_bin = FileReader::create("test.bin");
    Data data_bin;
    reader_bin->read_bin((char*)(&data_bin), sizeof(Data));
    std::cout << "二进制文件读取结果: " << std::endl;
    std::cout << data_bin.to_string() << std::endl;

    return 0;
}

测试结果:

文本文件读取结果  : 
1.000000 2.000000 3.000000

二进制文件读取结果: 
1.000000 2.000000 3.000000

其他

Data结构体中实现to_string()方法,还可以使用以下两种方式

  • 使用stringstream
#include <sstream>

inline std::string to_string() const{
    std::stringstream ss;
    ss.precision(15); // 设置保存位数
    ss  << x << " " << y << " " << z
        << std::endl;
    return ss.str();
}
  • 使用fmt::format
inline std::string to_string() const{
    return fmt::format("{} {} {}\n", x, y, z);
}

注:需要另外安装fmt

Python

Python文件读写非常方便,使用Numpy即可

import numpy as np

data = np.array([[0.1, 1, 2.2],
                 [3.3, 4, 5.2], 
                 [6.7, 7, 8.9]])

##### 文本文件操作 #####

# 保存为txt
np.savetxt("data.txt", data)
# 定义数据格式 i1: int8 i2: int16 f4: float64
data_type = np.dtype([("a", "i1"), ("b", "f4"), ("c", "f8")])

# 按照指定格式导入txt文件
data = np.loadtxt("data.txt", dtype=data_type)

# 访问读取的结果
print(data['a'])
print(data['b'])
print(data['c'])

##### 二进制文件操作 #####

# 保存为bin
data.tofile("data.bin")
# 按照指定格式导入bin文件
data = np.fromfile("data.bin", dtype=data_type)

# 访问读取的结果
print(data['a'])
print(data['b'])
print(data['c'])

运行结果:

----- txt -----
[0 3 6]
[1. 4. 7.]
[2.2 5.2 8.9]
----- bin -----
[0 3 6]
[1. 4. 7.]
[2.2 5.2 8.9]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++/Python文件读写 的相关文章

随机推荐

  • ROS多机通信

    配置主从机IP地址 分别使用sudo vi etc hosts在主从机的 etc hosts文件中添加下面的代码 xff0c 其中pi是主机的用户名 xff0c esdc是从机的用户名 ip要相应的进行更改 xff0c 可以使用ifconf
  • 路径规划 | 图搜索算法:JPS

    JPS算法全称为Jump Point Search xff0c 也就是跳点算法 xff0c 可以视为A 算法的一种改进算法 xff0c 它保留了A 算法的主体框架 xff0c 区别在于 xff1a A 算法是将当前节点的所有未访问邻居节点加
  • 路径规划 | 随机采样算法:Informed-RRT*

    在文章路径规划 随机采样算法 xff1a PRM RRT RRT Connect RRT 中 xff0c 介绍了具备渐近最优性的RRT 算法 随着采样点数的增多 xff0c RRT 算法的规划结果会逐渐收敛到最优 但是可以观察到 xff0c
  • Ubuntu20安装ROS noetic

    Ubuntu20对应的ROS版本为ROS noetic xff0c 安装过程如下 xff1a 1 打开Software amp Updates xff0c 勾选main universe restricted multiverse这四项 2
  • 使用VSCode进行远程C++开发

    本文以Windows连接Ubuntu子系统 WSL 为例来介绍VSCode的远程开发流程 首先在VSCode中安装Remote WSL插件 xff0c 重启VSCode xff0c 如下图所示 xff0c 连接WSL 如果是其他远程 xff
  • ROS话题发布和订阅节点的C++&Python实现

    本文将分别使用C 43 43 和Python来实现话题发布者和订阅者 xff0c 首先创建一个功能包 xff0c 命名为topic pub sub xff0c 添加roscpp xff0c rospy等依赖项 C 43 43 实现 创建话题
  • 只要活着,我愿意一辈子都做程序员

    前不久 xff0c 我看过一个有意思的帖子 xff0c 标题是 35岁是程序员的终点 作者列举了35岁的年龄已经不适合继续做程序员的种种原因 xff0c 试图说服在这个年龄段的程序员做出改变 xff0c 初一看 xff0c 我自己也觉得很有
  • 机器人自主导航 | ROS与移动底盘通信

    本实验是实现机器人自主导航的重要步骤 xff0c 对于轮式机器人 xff0c 可以通过在底盘加装轮式里程计的方式来获得机器人的速度数据 xff0c 这些数据可以用来辅助机器人实现自主定位 xff0c 同时机器人还需要将控制指令发送给移动底盘
  • 使用C++调用Python模块(Linux)

    使用Python调用C 43 43 库见 xff1a 我的另一篇博客 工程配置 本文使用的项目构建工具为CMake xff0c 使用FindPython工具在CMake工程中找到Python库 xff0c 注意CMake最低版本为3 12
  • ROS开机自启设置

    使用robot upstart功能包即可实现节点的开机自启 安装功能包 安装robot upstart功能包 xff0c 本文使用的Ubuntu20对应的ROS版本为noetic span class token function sudo
  • 信号处理 | 维纳滤波推导

    首先给出互相关函数定义 xff1a r s x m
  • 信号处理 | AR模型与Levinson-Durbin递推

    模型形式 由高斯白噪声驱动的全极点模型表示如下 xff1a e n
  • 使用Python调用C++库(基于pybind11)

    本文将用C 43 43 编写一个简单的向量运算库 xff0c 然后使用pybind11将其封装为python包 xff0c 再使用python调用 C 43 43 程序使用CMake构建 使用C 43 43 调用Python模块见 xff1
  • FTP实现Ubuntu与Windows文件互传

    FTP实现window与ubuntu文件互传 本文将介绍如何使用FTP实现Ubuntu和Windows间的文件互传 xff0c 基本方法是在Ubuntu主机上安装FTP服务端 xff0c 在其他设备 Windows 上安装FTP客户端 以下
  • KD-Tree详解: 从原理到编程实现

    C 43 43 实现链接 https gitee com ghowoght kd tree 在点云操作中 xff0c 常常需要从大量点云中找到距离输入点最近的点 xff0c 如果使用线性搜索 xff0c 逐个判断与输入点的距离 xff0c
  • FRP + NoMachine远程桌面开发指南

    在FRP内网穿透 远程ssh终端 43 rdp桌面配置 中介绍了如何远程使用FRP 43 RDP进行外网远程桌面访问 xff0c 但是实测很卡 在两台Ubuntu主机上进行了测试 xff0c 云服务器有8M带宽 xff0c 所以对这种远程桌
  • 升级!!!运用select实现一个简单的TCP通信!

    升级 xff01 xff01 xff01 运用select实现一个简单的TCP通信 多路转接模型select模型select模型的操作流程简介 TCP的实现封装一个TCP服务端封装一个select类main程序 多路转接模型 多路转接IO
  • 嵌入式部分BUG与解决方法记录(不定期更新)

    关闭串口缓存 在使用422转USB数据线采集IMU数据时 xff0c 上位机的USB驱动程序会对接收到的数据进行缓存 xff0c 表现在于IMU使用200Hz的频率发送IMU数据 xff0c 而采集到的IMU数据的时间戳间隔并不是5ms x
  • Windows的C++开发环境搭建(基于vcpkg+CMake)

    一直以来 xff0c 笔者都认为在windows中使用cmake开发C 43 43 是一件很难搞的事 xff0c windows不像linux那样能方便地对各种C 43 43 软件包进行管理 xff0c 直到发现了vcpkg这个包管理器 x
  • C++/Python文件读写

    C 43 43 为了方便开发 xff0c 写了一个文本读写程序 xff0c 能够读写二进制 文本格式的文件 xff0c 程序只由一个头文件组成 xff0c 可以很方便地加入到现有程序 完整程序如下 xff1a span class toke