Visual c++ 从C+中的4字节[二进制文件I/O]构建32位浮点+;

Visual c++ 从C+中的4字节[二进制文件I/O]构建32位浮点+;,visual-c++,file-io,binaryfiles,Visual C++,File Io,Binaryfiles,我相信这一定是一个常见的问题,但似乎找不到一个同等的问题*或例子 我有一个二进制文件,它是一系列4字节浮点。我正在读取一个向量,该向量的大小是文件的长度(除以浮点的大小)。我使用了来自的bytesToFloat方法。当打印出数据时,我的代码为所有数据点返回相同的值。怎么了 *如果我错过了,向管理员们道歉 #include <cstdio> #include <cstdlib> #include <iostream> #include <fstream&g

我相信这一定是一个常见的问题,但似乎找不到一个同等的问题*或例子

我有一个二进制文件,它是一系列4字节浮点。我正在读取一个向量,该向量的大小是文件的长度(除以浮点的大小)。我使用了来自的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;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
typedef无符号字符;
通过测试浮点数(uchar b0、uchar b1、uchar b2、uchar b3);
int main()
{
int i,j;
charu[4];
//打开文件
ifstream文件;
file.open(“file.dat”);
//以字节为单位查找文件大小
seekg(0,ios::end);
双尺寸=0;
size=file.tellg();
seekg(0,ios::beg);
矢量数据;
数据。调整大小(大小/4);
i=0;

虽然(i所以,通过一点努力和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);
}
}
向量缓冲区;
填空(){
字符串filename=“”;

如果删除所有这些循环,只需执行
file.read(&data[0],size);
(就在
resize
调用之后)操作,会发生什么?在运行时将
size
设为整数。另外,您如何知道您的文件实际上不包含相同值的副本?我预先尝试了file.read方法,它只输出十六进制值,而不是浮点本身。这就是为什么我尝试从其单个字节重新构造浮点。我在Visual Studio中打开了该文件,并十六进制值是不同的。另外,它是从我编写的另一段代码中随机生成的,该代码生成了一系列随机浮点(我已经检查了该程序的输出)。你说“它只输出”是什么意思?
read
不输出任何内容。我正在将使用
文件获得的
buffer
中的值发送到cout。read
将打印十六进制值,而不是我希望它存储的浮点值。在您显示的代码中没有名为
buffer
的变量。是否要跳过文件的前540个字节?这就是
的意思>在任何情况下,我非常确定
file.read((char*)&data[0],length)
也会有同样的效果(数据
data
vector
,大小适当调整),而不需要
bytesToFloat
。我跳过了文件中固定字节长度的头(为了简单起见,我以前没有提到过)。我尝试过使用您之前建议的方法,但无法使其正常工作(我在转换为字符时不断出现错误)。计算
长度
的方法无法解释此固定标题。是的,我忘记了在我最初的建议中需要转换为
char*
。通过转换,您应该能够直接读取
数据
。我在代码中固定了
长度
,从中删除跳过。我将编辑上面的回复。