从二进制读取2D浮点数组,从char *转换为float [2]

时间:2016-01-25 18:06:56

标签: c++ arrays reinterpret-cast

我有一个存储在二进制文件中的二维浮点数组。我用以下方式读出来:

#include <fstream>
#include <algorithm>
....
ifstream infile(fileName.c_str(), ios::in | ios:binary);
const int numCols = 2;
char rows[1 * sizeof(int)];
infile.read(rows, sizeof(int));
int numRows = * reinterpret_cast<int *>(rows);
char * temp;
temp = new char[numRows * numCols * sizeof(float)];
infile.read(temp, sizeof(float) * numRows * numCols);

然后我创建了float数组并使用memcpy来复制信息。

float binData[numRows][numCols];
memcpy(binData, temp, sizeof(float) * numRows * numCols); 

这种方法有效(binData包含我想要的内容),但我被告知不要使用memcpy。所以我改用它:

float * ftemp = reinterpret_cast<float *>(temp);
int loc;
for (int i = 0; i < numRows; ++i){
    for(int j = 0; j < numCols; ++j){
        loc = i * numCols + j;
        binData[i][j] = ftemp[loc];
    }
}

我尝试将copyftempbinData一起使用,但我收到了此错误:

  

将'float'赋值给'float [2]'

时出现不兼容的类型

使用双循环似乎过于复杂。由于信息以char数组中的正确顺序存储,因此应该有一种方法可以将其作为float [numRows][numCols]读取,或者只是将temp中保存的内存复制到{{1}但我无法弄明白。有没有办法直接将binData转换为char [],还是有其他float [][]设置允许我直接复制?

1 个答案:

答案 0 :(得分:1)

我只是直接阅读数组

#include <fstream>
#include <algorithm>
....
ifstream infile(fileName.c_str(), ios::in | ios:binary);
const int numCols = 2;
int numRows;
infile.read(reinterpret_cast<char *>(&numRows), sizeof(int));

float (*binData)[numCols] = new float[numRows][numCols];
//or float binData[numRows][numCols]; if you knew it can fit on the stack 
//and your compiler has variable sized arrays

//read into the array
infile.read(reinterpret_cast<char *>(binData), sizeof(float) * numRows * numCols);