读文件
#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;
}