从二进制读取二维浮点数组,从 char* 转换为 float[2]
Read 2D float array from binary, cast from char* to float[2]
我有一个存储在二进制文件中的二维浮点数组。我读出来使用:
#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];
}
}
我尝试将 copy
与 ftemp
和 binData
一起使用,但出现此错误:
incompatible types in assignment of 'float' to 'float [2]'
使用那个双循环似乎过于复杂。由于信息以正确的顺序存储在 char
数组中,因此应该有一种方法可以说只是将其作为 float [numRows][numCols]
读取或者只是将 temp
中保存的内存复制到 binData
但我想不通。有没有一种方法可以直接将 char []
转换为 float [][]
或者是否有替代 char
设置可以让我直接复制?
我只是像这样直接读入数组
#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);
我有一个存储在二进制文件中的二维浮点数组。我读出来使用:
#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];
}
}
我尝试将 copy
与 ftemp
和 binData
一起使用,但出现此错误:
incompatible types in assignment of 'float' to 'float [2]'
使用那个双循环似乎过于复杂。由于信息以正确的顺序存储在 char
数组中,因此应该有一种方法可以说只是将其作为 float [numRows][numCols]
读取或者只是将 temp
中保存的内存复制到 binData
但我想不通。有没有一种方法可以直接将 char []
转换为 float [][]
或者是否有替代 char
设置可以让我直接复制?
我只是像这样直接读入数组
#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);