C++读取特定大小二进制文件,一维数组形式和vector形式

#include <iostream>
#include <fstream>
#include<vector>
using namespace std;
/**
* @brief 读取二进制文件中的数据
* @param data_fname    二进制文件名
* @param rows          
* @param lines
* @param depths
* @param raw_data_matrix 输出结果
*
* @return 返回说明
*     -<em>-1</em> fail
*     -<em>0</em> succeed
*/
int ReadDATA_SV(const char*data_fname/*in*/, int rows/*in*/,
    int lines/*in*/, int depths/*in*/, float *raw_data_matrix/*out*/);

int main()
{
    //参数设置
    const int rows = 249;
    const int lines = 205;
    const int depths = 35;
    const char *data_fname = "S2020031120_000.DAT";
    float*raw_data_matrix = new float[rows*lines*depths];

    //函数调用
    int ret=ReadDATA_SV(data_fname, rows, lines, depths, raw_data_matrix);
    if (ret != 0){
        printf("函数调用失败!\n");
        return ret;
    }
    //告诉你这个一维数组怎么用,比如输出(:,:,1)
    cout << endl << "一维数组输出结果" << endl;
    for (int i = 0; i < 2; ++i)
    {
        for (int j = 0; j <lines; ++j)
        {
            for (int k = 0; k < 1; ++k)
            {
                cout << raw_data_matrix[i*lines*depths + j*depths + k] << " ";
            }
        }
        cout << endl;
    }
    //如果要转成Vector直接转
    vector<vector<vector<float>>>raw_data_matrix_vector(rows, vector<vector <float>>(lines, vector < float>(depths)));;
    for (int i = 0; i < rows; ++i)
    {
        for (int j = 0; j <lines; ++j)
        {
            for (int k = 0; k < depths; ++k)
            {
                raw_data_matrix_vector[i][j][k] = raw_data_matrix[i*lines*depths + j*depths + k];
            }
        }
    }
    //输出测试
    cout <<endl<< "vector输出结果" << endl;
    for (int i = 0; i < 2; ++i)
    {
        for (int j = 0; j <lines; ++j)
        {
            for (int k = 0; k < 1; ++k)
            {
                cout << raw_data_matrix_vector[i][j][k] << " ";
            }
        }
        cout << endl;
    }
    delete[]raw_data_matrix;
    raw_data_matrix = NULL;
    system("pause");
    return 0;
}
int ReadDATA_SV(const char*data_fname/*in*/, int rows/*in*/,
    int lines/*in*/, int depths/*in*/, float *raw_data_matrix/*out*/)
{
    int dataSumNumber = rows*lines*depths;
    float *rowData = new float[dataSumNumber];
    ifstream finFile(data_fname, ios::in | ios::binary);
    if (!finFile){
        cout << "error" << endl;
        return -1;
    }
    //先跳过8个字节
    finFile.seekg(8, ios::beg);
    finFile.read((char*)rowData, dataSumNumber * sizeof (float));
    int readedBytes1 = finFile.gcount(); //看刚才读了多少字节
    cout << "readedBytes1:" << readedBytes1 << endl;
    //读出来 rowData 是个(7815,205)的二维数组,还要转为三维的 raw_data_matrix(249,205,35)
    for (int dep = 0; dep < depths; ++dep){
        int ind_i = dep*rows;
        for (int row = 0; row < rows; ++row){
            for (int lin = 0; lin < lines; ++lin){
                raw_data_matrix[row*lines*depths + lin*depths + dep] =
                    rowData[(ind_i + row)*lines + lin];
            }
        }
    }
    
    //释放空间
    delete[]rowData;
    rowData = NULL;
    return 0;
}

 

posted @ 2020-06-30 11:38  const_wss  阅读(783)  评论(0编辑  收藏  举报