C++ 读写结构体文件

读文件

#include <iostream>
#include <fstream>
#include <vector>

// 定义结构体类型
typedef struct NIoSocket_temperature
{
    float front_right_cheek_temper;    // 主驾驶脸颊温度:
    float front_right_forehead_temper; // 主驾驶额头温度:
    float front_right_thermal_comfort; // 主驾驶热感受

    float front_left_cheek_temper;
    float front_left_forehead_temper;
    float front_left_thermal_comfort;

    float back_cheek_temper;
    float back_forehead_temper;
    float back_thermal_comfort;

    float roof_temper;

} Nio_tempera;

int main() {
    // 以二进制模式打开文件
    std::ifstream infile("data.bin", std::ios::binary | std::ios::in);
    if (!infile.is_open()) {
        std::cerr << "Failed to open the file." << std::endl;
        return 1;
    }

    // 使用循环逐个读取结构体,直到到达文件末尾
    std::vector<Nio_tempera> dataList;
    while (!infile.eof()) {
        Nio_tempera data;
        infile.read(reinterpret_cast<char*>(&data), sizeof(Nio_tempera));
        // 检查是否成功读取了一个完整的结构体
        if (infile.gcount() == sizeof(Nio_tempera)) {
            dataList.push_back(data);
        }
    }

    // 关闭文件
    infile.close();

    // 输出读取到的结构体数据
    for (const auto& data : dataList) {
        std::cout << "Data { a: " << data.front_right_cheek_temper << ", b: " << data.front_right_forehead_temper << ", c: " << data.front_right_thermal_comfort << " }" << std::endl;
    }

    return 0;
}

写文件

std::ofstream outfile("data.bin", std::ios::binary | std::ios::out);

if (!outfile.is_open()) {
    std::cerr << "Failed to open the file." << std::endl;
    // return 1;
}
outfile.write(reinterpret_cast<const char*>(&Nio_tempera_tmp), sizeof(Nio_tempera_tmp));

注意读文件时候,需要判断是否完整

int main() {
    // 以二进制模式打开文件
    std::ifstream infile("Msg.bin", std::ios::binary | std::ios::in);
    if (!infile.is_open()) {
        std::cerr << "Failed to open the file." << std::endl;
        return 1;
    }

    // 使用循环逐个读取结构体,直到到达文件末尾
    std::vector<Big_Struct> dataList;
    while (!infile.eof()) {
        Big_Struct data;
        infile.read(reinterpret_cast<char*>(&data), sizeof(Big_Struct));
        // 检查是否成功读取了一个完整的结构体
        if (infile.gcount() == sizeof(Big_Struct)) {
            std::cout << data.HasFourd_chs3_opt_sub << std::endl;
            std::cout << data.Hsgnss_sub << std::endl;
            std::cout << data.HasVeh50ms_sub << std::endl;
            std::cout << data.HasVeh10ms_sub << std::endl;
            std::cout << data.Hasvehicle_project_sub << std::endl;
            std::cout << data.HasFourd_chs3_info_sub << std::endl;
            std::cout << data.HasFourd_pd_info_sub << std::endl;
            std::cout << data.HasGlobal_Localization_sub << std::endl;
            std::cout << data.HasSdMap_package_sub << std::endl;
            std::cout << "++++++++++++++++++++++++" << std::endl;
        }

        // std::cout << data.HasFourd_chs3_opt_sub << std::endl;
        // std::cout << data.Hsgnss_sub << std::endl;
        // std::cout << data.HasVeh50ms_sub << std::endl;
        // std::cout << data.HasVeh10ms_sub << std::endl;
        // std::cout << data.Hasvehicle_project_sub << std::endl;
        // std::cout << data.HasFourd_chs3_info_sub << std::endl;
        // std::cout << data.HasFourd_pd_info_sub << std::endl;
        // std::cout << data.HasGlobal_Localization_sub << std::endl;
        // std::cout << data.HasSdMap_package_sub << std::endl;
        // std::cout << "++++++++++++++++++++++++" << std::endl;
    }

    // 关闭文件
    infile.close();
    return 0;
}

代码注释区域,会多执行一次

一次性将vector内容写入文件

std::string file_name = Dir_tmp + "/OutPutBin/HinOpt.bin";
std::ofstream HinOpt_file(file_name, std::ios::binary);
// 检查文件是否成功打开
if (!HinOpt_file.is_open())
{
    throw std::runtime_error("Failed to open the file.");
}
HinOpt_file.write(reinterpret_cast<char*>(SubStructVec.data()), SubStructVec.size() * sizeof(SubStruct));
HinOpt_file.close();
#include <iostream>
#include <fstream>
#include <vector>

struct MyStruct {
    int id;
    double value;
    // 其他成员...
};

int main() {
    // 创建一个存储结构体的 vector
    std::vector<MyStruct> dataVector(100); // 初始化为100个默认构造的结构体

    // 打开文件输出流,使用二进制模式
    std::ofstream outFile("output.bin", std::ios::binary);
    if (outFile.is_open()) {
        // 将整个 vector 一次性写入文件
        outFile.write(reinterpret_cast<const char*>(dataVector.data()), dataVector.size() * sizeof(MyStruct));
        // 关闭文件输出流
        outFile.close();
        std::cout << "数据已成功写入文件" << std::endl;
    } else {
        std::cerr << "无法打开文件" << std::endl;
    }

    return 0;
}

一次性多读结构体放入内存

#include <iostream>
#include <fstream>
#include <vector>

struct VesTimeSpeed {
    // 定义你的结构体成员
    // ...
};

int main() {
    // 打开文件进行读取
    std::ifstream input("your_file.bin", std::ios::binary);

    if (!input.is_open()) {
        std::cerr << "Failed to open file for reading." << std::endl;
        return 1;
    }

    // 定义一个存储结构体的向量
    std::vector<VesTimeSpeed> VesTimeSpeeVec(400);

    // 读取400个结构体
    input.read(reinterpret_cast<char*>(VesTimeSpeeVec.data()), VesTimeSpeeVec.size() * sizeof(VesTimeSpeed));

    // 获取实际读取的结构体数量
    size_t structCount = input.gcount() / sizeof(VesTimeSpeed);

    // 处理读取到的数据
    for (size_t i = 0; i < structCount; ++i) {
        // 处理每个结构体
        // ...
    }

    // 关闭文件
    input.close();

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值