【发布时间】:2014-10-10 22:08:27
【问题描述】:
我确定这一定是一个常见问题,但似乎找不到等效的问题*或示例。
我有一个二进制文件,它是一系列 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;
}
【问题讨论】:
-
如果你放弃所有这些循环,只执行
file.read(&data[0], size);(在resize调用之后)会发生什么?将size设为整数。另外,你怎么知道你的文件不实际上包含相同值的副本? -
我之前尝试了 file.read 方法,它只输出十六进制值而不是浮点数本身。这就是为什么我尝试从其各个字节重新构造浮点数的原因。我在 Visual Studio 中打开文件,十六进制值不同。它也是从我编写的另一段代码中随机生成的,该代码生成了一系列随机浮点数(我已经检查了该程序的输出)。
-
你是什么意思,“它只输出”?
read不输出任何内容。 -
我将使用
file.read获得的buffer中的值发送到cout。它打印十六进制值而不是我希望它存储的浮点数。 -
您显示的代码中没有名为
buffer的变量。
标签: visual-c++ file-io binaryfiles