参考博客:

C++二进制文件的读取和写入(精华版) (先看且全看)

C/C++读写文本文件、二进制文件 (我只看了 五)

13.14C++对二进制文件的读写操作 (很好,可只看读写部分)

学习此内容的目的是我需要将原本存储内容的csv文件转移至dat二进制文件

在test5000.csv中保存了5000*128的float数

写入binary.dat

#include <iostream>#include <fstream>#include <string>
#include <vector>
#include<algorithm>
using namespace std;vector<vector<float> >a;  //��ά����洢�������
vector<float>b;inline void file_to_string(vector<string> &record, const string& line, char delimiter);inline float string_to_float(string str);void read()
{vector<string> row;string line;string filename;ifstream in("test5000.csv");  if (in.fail())  { cout << "File not found" <<endl; return ; } while(getline(in, line)  && in.good() ){file_to_string(row, line, ',');  //��line��ĵ�Ԫ�������ַ���ȡ��������,��Ϊ��Ԫ��ָ���for(int i=0, leng=row.size(); i<leng; i++){b.push_back(string_to_float(row[i]));}a.push_back(b);b.clear();}in.close();return ;
}inline void file_to_string(vector<string> &record, const string& line, char delimiter)
{int linepos=0;char c;int linemax=line.length();string curstring;record.clear();while(linepos<linemax){c = line[linepos];if(isdigit(c)||c=='.'){curstring+=c;}else if(c==delimiter&&curstring.size()){record.push_back(curstring);curstring="";}++linepos;}if(curstring.size())record.push_back(curstring);return;
}inline float string_to_float(string str){int i=0,len=str.length();float sum=0;while(i<len){if(str[i]=='.') break;sum=sum*10+str[i]-'0';++i;}++i;float t=1,d=1;while(i<len){d*=0.1;t=str[i]-'0';sum+=t*d;++i;}return sum;
}int main(){read();printf("total numbers of people: %d\n",a.size());vector<float> fea;ofstream outFile("binary.dat", ios::out | ios::binary);for (int i=0; i<a.size(); i++){fea = a[i];outFile.write((char*)&fea[0], 128*sizeof(float));}outFile.close();return 0;
}

View Code

ofstream outFile("binary.dat", ios::out | ios::binary);for (int i=0; i<a.size(); i++){fea = a[i];outFile.write((char*)&fea[0], 128*sizeof(float));
}
outFile.close();

a为vector<vector<float> >类型

fea为vector<float> 类型

读binary.dat

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;int main(){ifstream inFile("binary.dat", ios::in | ios::binary);if(!inFile){cout<< "error" <<endl;return 0;}float fea[128];int n=0;while(inFile.read((char *)&fea[0], 128*sizeof(float))){//print dim1 of each imgn++;}inFile.close();cout<<n<<endl;for(int i=0;i<128;i++)cout<<fea[i]<<" ";return 0;
}

可以看到确实读出了这5000个向量,并存进了float数组

以上为测试内容,下面为我实际使用的情况

我在尝试过程中结构体内使用了向量和string,结果报错,我猜测这里的数据类型需要确定,尽量用数组,这样可以准确的算出字节数。

class Face{public:float fea[128];char name[30];
};

读取图片保存至binary.dat二进制文件

//write binary.dat
void img2dat(){struct dirent *ptr, *ptr1;DIR *dir, *dir1;dir = opendir("../lfw_crop/");string file_path, temp;std::vector<Anchor> result_copy;int num = 0,count = 1;ofstream outFile("binary.dat", ios::out | ios::binary);Face face_temp[6000];// printf("lists of files:\n");while((ptr = readdir(dir)) != NULL){if(ptr->d_name[0] == '.')continue;//search subdirectorychar sub_dir[50] = "../lfw_crop/";strcpy(face_temp[num].name, ptr->d_name);strcat(sub_dir, ptr->d_name);file_path = sub_dir;dir1 = opendir(sub_dir);while((ptr1 = readdir(dir1)) != NULL){if(ptr1->d_name[0] == '.')continue;temp = ptr1->d_name;file_path = file_path + "/" + temp;cv::Mat img = imread(file_path);count = 1;cout<<temp<<endl;Mat face = mt(img, result_copy, count);if (count){fea = extract_feature(face);for(int i=0;i<128;i++)face_temp[num].fea[i] = fea[i];outFile.write((char*)&face_temp[num], sizeof(face_temp[num]));cout<<++num<<endl;}//just one imgbreak;}closedir(dir1);}closedir(dir);outFile.close();
}

View Code

读binary.dat并进行特征比对

if(count){clock_t start_2, finish_2;start_2 = clock();vector<float> feature2 = extract_feature(face2);finish_2 = clock();cout << "mobilefacenet cost " << (float)(finish_2 - start_2) / CLOCKS_PER_SEC * 1000 << " ms" << endl;//2019.6.12int i=0, num=0;double curcal, max=0;string forecast_name;//2019.6.17// float fea[128];string name;clock_t start_3, finish_3;start_3 = clock();Face face_temp[6000];while(inFile.read((char *)&face_temp[num], sizeof(face_temp[num]))){curcal = calculSimilar(feature2, face_temp[num].fea);if(curcal > max){max = curcal;forecast_name = face_temp[num].name;} }finish_3 = clock();cout << "search binary.dat cost & calculSimilar:" << (float)(finish_3 - start_3) / CLOCKS_PER_SEC * 1000 << " ms" << endl;cout << "max similarity is: "<< max << endl;cout << "forecast name is: "<< forecast_name <<endl <<endl;}

View Code

转载于:https://www.cnblogs.com/exciting/p/11041996.html

c++ 二进制文件读写相关推荐

  1. 以下不是python文件读写方法的是-使用Python进行二进制文件读写的简单方法(推荐)...

    总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块. python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据 ...

  2. C语言文件读写(3)-二进制文件读写操作

    C语言文件读写-二进制文件读写操作 先说说什么是二进制文件,二进制文件是相对于文本文件而言的,文本文件是由一行一行的字符的有序序列组成的.二进制文件就没有行的概念了,也是由有序的字符组成的,但是在写入 ...

  3. python 二进制文件_使用Python进行二进制文件读写的简单方法(推荐)

    总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块. python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据 ...

  4. 网络编程(part3)--文件读写之二进制文件读写/with操作

    鄙人学习笔记 文章目录 二进制文件读写 举个例子1(以二进制方式打开并读取txt文件) 举个例子2(以二进制方式打开并读取图片) 举个例子3(二进制文件打开并写入操作) 关闭文件 with操作 wit ...

  5. C++文本文件操作和二进制文件读写

    文本文件操作: 代码如下: #include <iostream> #include <fstream> using namespace std;void test01() { ...

  6. 基于结构体的二进制文件读写

    基于结构体的二进制文件读写 项目介绍 工程创建 结构体的创建 写二进制文件 结果 读二进制文件 结果 参考文献 项目介绍 本次设计是为了提高读写二进制文件的效率,以约定的结构体形式进行读写操作,避免了 ...

  7. python能以文本和二进制方式处理文件_使用Python进行二进制文件读写的简单方法(推荐)...

    总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块. python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据 ...

  8. Linux内核源代码分析——可执行文件header处理(二进制文件读写范例,写DUL工具入门指引)...

    在把Linux内核源代码生成Image之前,需要把执行文件头结构信息剔除出来.这个过程对理解Linux内核具有很大的帮助.同时,由于是对可执行文件进行直接读写操作,想写DUL工具的童鞋可以在这里学习到 ...

  9. python处理二进制文件_使用Python进行二进制文件读写的简单方法(推荐)

    总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块. python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据 ...

  10. 实验十 学生成绩管理(二进制文件读写)byHNU信息院2020小毕

    实验十 文件读写 学生成绩管理(二进制文件读写) [问题描述] 在以下问题中,定义学生的结构体student,录入学生信息,并存入到二进制文件grade.bin中,要求存入的是按照总成绩从大到小的顺序 ...

最新文章

  1. 互联网产品接入支付功能如何测试?
  2. 看样子还是:JSP和JAVA
  3. Java打乱牌的算法_Leetcode 384. 打乱数组 (洗牌算法)
  4. PHP处理图片(orientation)旋转问题
  5. 如何启用ruler?
  6. 写给大数据开发初学者的话
  7. GDCM:将PDF文件转换为DICOM / PDF文件的测试程序
  8. java第一季_Java入门第一季
  9. 12个数据分析里最常用的思维定式,收藏起来吃灰
  10. Shiro Spring 集成xml配置
  11. ubuntu18 安装 mysql5.7
  12. 计算机win7音量调节,如何解决Win7电脑声音小的问题?
  13. 什么是gzip?为什么要用gzip?使用gzip的优势和劣势是什么?需要哪些岗位进行配合才能够实现gzip内容的应用?
  14. java-php-python-ssm无人智慧药柜系统设计计算机毕业设计
  15. 频域处理:傅里叶变换及小波变换
  16. 程序员常用官网和工具站
  17. 线性回归的推导与java代码
  18. oracle 字符串分割成数组_oracle 中如何分割字符串成为数组?
  19. linux atom编辑器下载,Atom 1.7.0 发布下载,跨平台开源文本编辑器
  20. TDSQL的安装教程(低配体验)

热门文章

  1. (详细)《美国节日》:某月的第几个星期几
  2. 批量wod转pdf、批量excle转pdf、pdf转excle、word实现方案
  3. Java工程师简历范文大学生,最全Java知识总结
  4. i7z – 用来查看CPU状况
  5. Object Detection with Discriminatively Trained Part-Based Models
  6. 深度学习AI美颜系列---图像自动亮度对比度与调色
  7. 给div盒子设置背景图片
  8. #贴改色膜前,你必须要知道的事情
  9. 喷泉设备中的水幕效果
  10. 视频编码起源历史发展及现状