c++ 二进制文件读写

参考博客:

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;
}
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 img
        n++;
    }
    inFile.close();
    
    cout<<n<<endl;
    for(int i=0;i<128;i++)
        cout<<fea[i]<<" ";
    return 0;
}

扫描二维码关注公众号,回复: 6534743 查看本文章

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

本来一开始想用向量格式存储,但遇到了些问题,网上没有查到比较好的向量用法,我猜测是向量的格式读取问题,数组这方面更可控些,如果使用结构体的话内部也是用数组居多,毕竟你知道批量存储的数据类型格式大小,直接定义成数组就ok,当然是可以按向量存取的,只不过我没搞定

猜你喜欢

转载自www.cnblogs.com/exciting/p/11041996.html