2016-01-25 20 views
1

我有一个存储在二进制文件中的浮点数的二维数组。我读出来使用:从二进制读取2D浮点数组,从char *转换为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); 

我然后创建的浮动阵列和用于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但我得到这个错误:

incompatible types in assignment of 'float' to 'float [2]'

这似乎过于复杂,使用的是双回路。由于信息在char阵列中以正确的顺序存储,应该有一种方法可以将其读取为float [numRows][numCols]或者将temp中保存的内存复制到binData,但我无法弄清楚。有没有办法将char []直接转换为float [][]或者是否有替代char的设置,可以让我直接复制?

+1

'炭临时数组[* numRows行数numCols *的sizeof(浮动)];'这是不合法的C++。 – PaulMcKenzie

+1

有几个指针和数组以及在那里并不是真正需要的数组和变体,以及您在[variable-length arrays]中使用非标准功能(https://en.wikipedia.org/wiki/Variable-length_array )。呵呵,还有一些破坏[string aliasing rule](http://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule)。 –

+3

除非此代码对速度要求严格(从很少的文件中读取数据),否则我建议您使用[标准容器](http://en.cppreference),使用简单*路径,并使用C++功能。 com/w/cpp/container),[标准算法](http://en.cppreference.com/w/cpp/algorithm),[标准I/O功能](http://en.cppreference.com/w/cpp/io)和[标准迭代器助手](http://en.cppreference.com/w/cpp/iterator)。 –

回答

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); 
相关问题