精华内容
下载资源
问答
  • C++二进制文件读写

    2018-04-09 22:50:55
    C/C++实现简单的二进制文件读取和写入示例 1.包含如何读取和写入数字,以及用缓存按字节读取 2.采用标准输入和输出函数创建、打开、关闭文本文件二进制文件
  • 最近在做项目的时候遇到了这个问题,所以想着总结下,方法自己和有需要的朋友,下面这篇文章主要介绍了利用C/C++二进制读写png文件的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
  • 要把数据先合并到一个大的buffer里,然后把这个buffer写成二进制文件,然后重新读取这个二进制文件,然后把数据分配还原 代码如下: #include <iostream> #include <fstream> #include <vector&...

    要把数据先合并到一个大的buffer里,然后把这个buffer写成二进制文件,然后重新读取这个二进制文件,然后把数据分配还原

    代码如下:

    #include <iostream>
    #include <fstream>
    #include <vector>
    using namespace std;
    
    int main()
    {
    	//Origin Objects
    	vector<int> srcData_01 = { 0, 1, 2, 3, 4, 5 , 6, 7, 8, 9, 10, 11, 12, 13 };
    	int srcData_01Size = sizeof(int) * srcData_01.size();
    
    	vector<float> srcData_02 = { 1.1f, 2.1f, 1.5f, 2.3f};
    	int srcData_02Size = sizeof(float) * srcData_02.size();
    
    	//StoreBuffer
    	vector<char> buffer;
    	buffer.resize(srcData_01Size + srcData_02Size);
    
    	//New Objects
    	vector<int> destData_01;
    	destData_01.resize(srcData_01.size());
    
    	vector<float> destData_02;
    	destData_02.resize(srcData_02.size());
    
    
    	//Origin object to store buffer
    	memcpy(buffer.data(), srcData_01.data(), srcData_01Size);
    	memcpy(buffer.data() + srcData_01Size, srcData_02.data(), srcData_02Size);
    
    	ofstream writeFile;
    	writeFile.open("Files/TestBMP.data", std::ios::out | std::ios::binary);
    	if (!writeFile)
    	{
    		cout << "Error opening file" << endl;
    		return 0;
    	}
    	writeFile.write(buffer.data(), srcData_01Size + srcData_02Size);
    	writeFile.close();
    
    	//readBuffer
    	vector<char> readbuffer;
    	readbuffer.resize(srcData_01Size + srcData_02Size);
    
    	ifstream readFile;
    	readFile.open("Files/TestBMP.data", std::ios::in | std::ios::binary);
    	if (!readFile)
    	{
    		cout << "Error opening file" << endl;
    		return 0;
    	}
    	readFile.read(readbuffer.data(), srcData_01Size + srcData_02Size);
    	readFile.close();
    
    	//Store buffer to new object
    	memcpy(destData_01.data(), readbuffer.data(), srcData_01Size);
    	memcpy(destData_02.data(), readbuffer.data() + srcData_01Size, srcData_02Size);
    
    	return 0;
    }

     

    展开全文
  • C++读取二进制文件

    2015-04-28 20:53:52
    二进制文件,支持随机读取额,需要事先知道数据结构,欢迎使用
  • c++ 二进制文件读写

    2019-06-17 20:23:00
    C++二进制文件的读取和写入(精华版)(先看且全看) C/C++读写文本文件、二进制文件(我只看了 五) 13.14C++对二进制文件读写操作(很好,可只看读写部分) 学习此内容的目的是我需要将原本存储内容的csv...

    参考博客:

    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 img
            n++;
        }
        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 subdirectory
            char 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 img
                break;
            }
            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.12
                int 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++ 二进制读写文件的方法

    千次阅读 2020-03-25 16:01:12
    开发过程,遇见将文件二进制的方式读取到缓存中的场景,于是在这里记录一下,方便以后复用。 读文件 void readFile(string& filePath, std::vector<unsigned char>& data ) { ifstream file...

    开发过程,遇见将文件以二进制的方式读取到缓存中的场景,于是在这里记录一下,方便以后复用。

    读文件

    void readFile(string& filePath, std::vector<unsigned char>& data )
    {
    	ifstream file(filePath.c_str(), std::ios::in | std::ios::binary);
    	if(!(file.is_open()))
    	{
    		return;
    	}
    
    	file.seekg(0, std::ios::end); //定位输入流结束位置
    	std::ios::pos_type endPos = file.tellg(); //获取输入流结尾指针
    	unsigned long fileLen = static_cast<unsigned long>(endPos); //获取输入数据大小
    
    	file.seekg(0, std::ios::beg);	//定位输入流开始位置
    	data.resize(fileLen);
    	file.read((char*)(&data[0]), fileLen);	//将输入数据读取到缓存中
    	//自动关闭文件
    }

    写文件

    void writeFile(string& filePath, vector<unsigned char> data )
    {
    	ofstream file(filePath.c_str(), std::ios::out | std::ios::binary);
    	if(!(file.is_open()))
    	{
    		return;
    	}
    	file.write((char*)&data[0], data.size());	//将数据写到文件中
    	//自动关闭文件

     

    展开全文
  • 掌握C语言二进制文件读写方式; 掌握CPP文本文件读写方式; 掌握CPP二进制文件读写方式; 二:C语言文本文件读写 1. 文本文件写入 //采用C模式对Txt进行写出 void TxtWrite_Cmode() { //准备数据 int index[50] ;...
  • //作用域内先把要写的二进制文件加锁,{}后自动解锁 std :: lock_guard < std :: mutex > lock ( database_mutex ) ; std :: ofstream out_database_file ( database_path , std :: ios :: binary | std :...

    读:

    std::ifstream in_database_file(database_path, std::ios::binary);
    if (!in_database_file.is_open())
    {
         std::cout << "Error: Fail to open database file." << std::endl;
         //throw std::exception("Error!");
         std::exception();
    }
    //int one_item_size = sizeof(FeatureItem);
    char one_item[2052];  // 2052 == one_item_size
    in_database_file.read(one_item, sizeof(FeatureItem));
    FeatureItem *feature;
    feature = reinterpret_cast<FeatureItem *>(one_item);
    std::cout << feature->feature.size() << std::endl << feature->user_id << std::endl;
    in_database_file.close();
    

    写:

    // write to database
    {
    	//作用域内先把要写的二进制文件加锁,{}后自动解锁
    	std::lock_guard<std::mutex> lock(database_mutex);
    	std::ofstream out_database_file(database_path, std::ios::binary | std::ios::app);
    	if (!out_database_file.is_open())
    	{
            std::cout << "Fail to open database file." << std::endl;
    		//throw std::exception("Error!");
         	std::exception();
    	}
        out_database_file.write(reinterpret_cast<char *>(&lfeature), sizeof(FeatureItem));
    	out_database_file.close();
    }
    

    判断二进制文件大小:

    std::ifstream in_database_file(database_path, std::ios::binary);
    if (!in_database_file.is_open())
    {
    	std::cout << "Fail to open database file." << std::endl;
    	//throw std::exception("Error!");
    	throw std::exception();
    }
    in_database_file.seekg(0, std::ios::end);
    std::streamoff database_length = in_database_file.tellg();
    in_database_file.close();
    //减去插入的一个自己版本信息(uchar),再除以Item大小,就可得出多少个Item
    uint database_id_length = uint((static_cast<uint>(database_length) - sizeof(uchar)) / sizeof(FeatureItem));
    
    展开全文
  • python/c/c++ 二进制文件读写

    千次阅读 2016-11-14 17:21:46
    1.python 二进制文件读写只讨论二进制文件读写。 以二进制的形式打开文件with open(filename , 'wb') as fd : #do with fd fd.write(strobject)#二进制strobject写入文件 fd.read(byte_len)#读取byte_len...
  • C++二进制文件读写

    2021-07-12 11:12:26
    一、随机读写 c++为流提供了两套设置位置指针的成员函数,为了兼容有两个位置指针的系统,但是由于Linux和Windows系统底层只有一个位置指针,所以使用其中之一即可 istream &seekg( off_type offset, ios::...
  • C++二进制文件读写操作

    千次阅读 2018-06-14 20:59:51
    因为项目需要,所以需要学习一下对二进制文件读写的操作,特此记录成长也跟大家总结分享一下较为全面的用法! 百度经验 二进制文件不是以ASCII形式存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,...
  • C++ 二进制文件读写

    千次阅读 2014-03-29 20:31:17
    //写数据到文件 ofstream fout("data.txt",ios::binary); if (!fout) { cout; } for (int i=0;i;i++) { fout.write(rein
  • c++二进制文件读写操作

    千次阅读 2016-11-27 21:33:08
    相比于普通的文本文件二进制文件的以字节为存储单位多出了许多优点,下面是有关二进制文件读写操作。 主要用到两个函数,在头文件fstream中。读read,写write。下面详情。 (一)写操作。 ofstream write...
  • C++ 二进制文件 & 顺序读写

    多人点赞 2021-05-20 22:41:44
    C++ 二进制文件 & 顺序读写.
  • 还有一篇博客,希望能分享点东西, 直接百度搜"Qt实现GUI的二进制文件读写操作(源码分析+工程打包+测试例子)
  • C/C++读写二进制文件

    2017-06-07 15:40:52
    一、打开二进制文件 FILE *fopen( const char *filename, const char *mode ); filename是要操作的文件名。  mode 说明 "wb" 打开一个二进制文件,进行写入操作。如果文件不存在,则会建立一个新文件. 存在则...
  • 想在c++实现在一个二进制文件中写入“”good“”一串字符,并把它读处来,该怎么实现?
  • C++读写二进制文件

    千次阅读 2018-07-28 09:57:42
    1、读二进制文件的数据内容时,使用到 ifstream 类,三个步骤(1)打开文件 open 函数;(2)读文件 read 函数;(3)关闭文件 close 函数。 2、写二进制文件的数据内容时,使用到ofstream 类,三个步骤(1)打开...
  • C/C++读写文本文件二进制文件

    万次阅读 多人点赞 2017-12-13 10:44:11
    C语言文本文件读写方式;C语言二进制文件读写方式;CPP文本文件读写方式;CPP二进制文件读写方式;
  • C++ 二进制文件读写

    2019-11-21 14:46:06
    二进制方式写文件,利用流对象的成员函数write。 函数原型: ostream & write(const char * buffer, int len); 参数含义:buffer指向内存中一段存储空间,len是写的字节数。 #include<iostream> #...
  • //以二进制方式打开目标文件 ifstream fin(szOrigFile.c_str(), ios::binary); //以二进制方式打开原始文件 bool bRet = true; if(fin.bad()) { //原始文件出错 bRet = false; }else{ fin.seekg(0L,ios::beg); //...
  • 二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的...对二进制文件读写主要用istream类的成员函数read和write来实现。这两个成员函数的原型为 istre

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,398
精华内容 18,959
关键字:

c++二进制文件读写

c++ 订阅