参考博客:
C++二进制文件的读取和写入(精华版) (先看且全看)
C/C++读写文本文件、二进制文件 (我只看了 五)
学习此内容的目的是我需要将原本存储内容的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; }
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 img n++; } inFile.close(); cout<<n<<endl; for(int i=0;i<128;i++) cout<<fea[i]<<" "; return 0; }
扫描二维码关注公众号,回复:
6534743 查看本文章
可以看到确实读出了这5000个向量,并存进了float数组
本来一开始想用向量格式存储,但遇到了些问题,网上没有查到比较好的向量用法,我猜测是向量的格式读取问题,数组这方面更可控些,如果使用结构体的话内部也是用数组居多,毕竟你知道批量存储的数据类型格式大小,直接定义成数组就ok,当然是可以按向量存取的,只不过我没搞定