在C ++中用4字节[二进制文件I / O]构建32位浮点数

时间:2014-10-10 22:08:28

标签: visual-c++ file-io binaryfiles

我确定这一定是一个常见问题,但似乎找不到同等问题*或示例。

我有一个二进制文件,它是一系列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;
}

1 个答案:

答案 0 :(得分:0)

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

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的字节顺序不正确所以现在已被反转,它输出的值与原始文件相同(我将随机文件生成器输出为纯文本版本进行比较)。