2014-10-10 16 views
1

我确定这肯定是一个常见问题,但似乎无法找到等价的问题*或示例。从C++中的4字节[二进制文件I/O]构建32位浮点数

我有一个二进制文件,是一系列4字节的浮点数。我读入一个由文件长度决定的矢量(除以我的浮点数)。我使用了another post的bytesToFloat方法。打印出数据时,我的代码为所有数据点返回相同的值。怎么了?

*对不起,管理员,如果我错过了它。

#include <cstdio> 
#include <cstdlib> 
#include <iostream> 
#include <fstream> 
#include <vector> 

using namespace std; 

typedef unsigned char uchar; 

float bytesToFloat(uchar b0, uchar b1, uchar b2, uchar b3); 

int main() 
{ 
int i,j; 
char u[4]; 
// Open file 
ifstream file; 
file.open("file.dat"); 
// Find file size in bytes 
file.seekg(0,ios::end); 
double size = 0; 
size = file.tellg(); 
file.seekg(0,ios::beg); 

vector<float> data; 
data.resize(size/4); 
i=0; 
while(i<size/4) 
{ 
    j=0; 
    while(j<4) 
    { 
     file.read(&u[j],1); 
     j++; 
    } 
    data[i] = bytesToFloat(u[0],u[1],u[2],u[3]); 

    cout << data[i]<< endl; 
    i++; 
} 

// End program 
file.close(); 
return 0; 
} 

float bytesToFloat(uchar b0, uchar b1, uchar b2, uchar b3) 
{ 
float output; 

*((uchar*)(&output) + 3) = b0; 
*((uchar*)(&output) + 2) = b1; 
*((uchar*)(&output) + 1) = b2; 
*((uchar*)(&output) + 0) = b3; 

return output; 
} 
+0

如果你放弃所有这些循环,并执行'file.read(&data [0],size);'(在调整resize'之后)会发生什么?当你处于这个状态时,使'size'成为一个整数。另外,你怎么知道你的文件不**实际上包含相同值的副本? – 2014-10-11 01:10:32

+0

我尝试了file.read方法,它只输出十六进制值而不是浮点本身。这就是为什么我试图重新构造它的单个字节的浮点数。 我在Visual Studio中打开文件,并且十六进制值不同。它也是从我写的另一段代码中随机生成的,它生成一系列随机的浮点数(并且已经检查了该程序的输出)。 – 2014-10-13 08:51:51

+0

你是什么意思,“它只输出”? 'read'不输出任何内容。 – 2014-10-13 15:15:19

回答

0

因此,经过一番努力和伊戈尔的评论,我能够解决这个问题。以下函数将所有内容读入缓冲区向量。

vector<char> buffer; 

void fill() { 
string filename = ""; 
cout << "Please enter a filename:\n>"; 
getline(cin, filename); 

ifstream file(filename.c_str()); 

if (file) { 
    file.seekg(0,std::ios::end); 
    streampos length = file.tellg(); 
    cout<< length << endl; 
    file.seekg(0,std::ios::beg); 
    file.seekg(540,'\0'); 

    length-=540; 
    buffer.resize(length); 
    file.read(&buffer[0],length); 
} 
} 

然后稍后我会在循环中调用bytesToFloat。 bytesToFloat的字节顺序是不正确的,所以现在已经颠倒过来了,它输出和我原始文件相同的值(我把我的随机文件生成器输出为纯文本版本进行比较)。

+0

您是否想要跳过文件的前540个字节?这就是'file.seekg(540,'\ 0');'做的。在任何情况下,我都非常肯定'file.read((char *)&data [0],length)'会产生相同的效果('data'是'vector ',适当调整大小),而不需要'bytesToFloat'。 – 2014-10-13 15:18:15

+0

我正在跳过文件中的固定字节长度的标题(为简单起见,我没有提到过)。我尝试过使用你之前建议的方法,但无法使其正常工作(我一直在将转换为char的过程中遇到错误)。 – 2014-10-14 10:37:22

+0

您计算“长度”的方式不包含此固定标题。是的,我忘了需要在我最初的建议中使用char *'。通过演员阵容,你应该能够直接读入“数据”。 – 2014-10-14 14:08:55

相关问题