• 57 c++ 读取二进制文件: 以.raw后缀的TDF_Voxel_Size文件为例


    0 引言

    毕业设计中用到了.raw格式的文件,需要将该文件按照M*N*P的矩阵格式加载到内存中。采用 #include <fstream> 中的FILE* 加载,并针对数据占用字节数,以 float* f = (float*) buffer; 语句强制转换类型,得到规整的文本数据。最后,由于数据量超出了 vector.max_size(),采用三维vector对数据进行存储,完成加载目标。

    1 输入输出

    输入包含两个文件, 分别是:

      1、bicycle000002.size文件,包含数据格式描述({m, n, p, q});

      2、bicycle000002.raw,序列化存储矩阵中的每一个数。

    期望的输出:

      将上述.raw文件中的数以矩阵 m*n*p的形式读入到内存中。

    2 demo

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    void ReadSizeFile(const char *file_path, int size[4])
    {
        FILE *file;
        file = fopen(file_path, "rt+");
        if (!file) //条件不成立,则说明文件打开失败
        {
            fclose(file);
            cout << "打开文件失败! " << endl;
        }
        fscanf(file, "Float32(%d, %d, %d, %d)", &size[0], &size[1], &size[2], &size[3]);
        fclose(file);
    }
    void ReadTDFfile(const char *file_path, vector<vector<vector<float>>>& object_TDF_data, int size[4]){
        FILE *pFile;
        long lSize;
        char *buffer;
        size_t result;
        pFile = fopen(file_path, "rb");
        if (pFile == NULL)
        {
            fputs("File error", stderr);
            exit(1);
        }
        // obtain file size:
        fseek(pFile, 0, SEEK_END);
        lSize = ftell(pFile);
        rewind(pFile);   // 指针倒带至头
        // allocate memory to contain the whole file:
        buffer = (char *)malloc(sizeof(char) * lSize);
        if (buffer == NULL)
        {
            fputs("Memory error", stderr);
            exit(2);
        }
        // copy the file into the buffer:
        result = fread(buffer, 1, lSize, pFile);
        if (result != lSize)
        {
            fputs("Reading error", stderr);
            exit(3);
        }
    
        float* f = (float*)buffer;
        /* the whole file is now loaded in the memory buffer. */
        for(int i=0; i< size[0]; ++ i){
            vector<vector<float>> column_row;
            for(int j=0; j< size[1]; ++ j){
                vector<float> row;
                for(int k=0; k<size[2]; ++ k){
                   row.push_back(*f);
                   ++ f;
                }
                column_row.push_back(row);
                row.clear();
            }
            object_TDF_data.push_back(column_row);       
            column_row.clear();
        }
        // terminate
        fclose(pFile);
        free(buffer);
    }
    
    int main()
    {
        const char *file_path_size = "bicycle000002.size";
        int size[4];
        ReadSizeFile(file_path_size, size);
    
        vector<vector<vector<float>>> object_TDF_data;
        const char *file_path_data = "bicycle000002.raw";
        ReadTDFfile(file_path_data, object_TDF_data, size);
        return 0;
    }

    3 测试文件下载链接

    我把相关project开源在了我的github上,欢迎下载。

    https://github.com/2017Greg/myVscodeProject/tree/master

    下载的时候请同时下载代码readTDF.cpp和测试文件 bicycle000002.size和bicycle000002.raw

  • 相关阅读:
    让flask在出现语法错误时仍然自动重启
    ubuntu配置zsh和oh-my-zsh
    docker运行python3.6+flask小记
    vscode python3 配置生成任务
    从flask视角理解angular(四)Route
    从flask视角理解angular(三)ORM VS Service
    从flask视角理解angular(二)Blueprint VS Component
    从flask视角学习angular(一)整体对比
    Linux高级变量
    linux系统中查看日志及系统信息
  • 原文地址:https://www.cnblogs.com/ghjnwk/p/10558730.html
Copyright © 2020-2023  润新知