如何从C中的二进制文件中读取浮点数?

时间:2009-09-14 17:09:36

标签: c++ c file-io

我通过谷歌找到的所有内容都是垃圾......请注意,我希望答案 C ,但是如果您使用C ++解决方案补充答案以及然后你获得奖励积分!

我只是希望能够从二进制文件中读取一些浮点数

编辑:是的我知道关于Endian-ness ...而且我不在乎它是如何存储的。

7 个答案:

答案 0 :(得分:18)

如何完全从文件中读取浮点数取决于值的保存方式。一种常见的方式可能是:

void writefloat(float v, FILE *f) {
  fwrite((void*)(&v), sizeof(v), 1, f);
}

float readfloat(FILE *f) {
  float v;
  fread((void*)(&v), sizeof(v), 1, f);
  return v;
}

答案 1 :(得分:5)

float f;
if(read(fd,&f,sizeof(f))==sizeof(f))
    printf("%f\n",f);
else
    printf("oops\n");

前提是它是兼容的二进制表示。

read 用于文件描述符, fread 用于FILE* istream::read c++ iostreams。选择你喜欢的东西:

read(fd,&f,sizeof(f))==sizeof(f)

fread(&f,sizeof(f),1,fp)==1

fin.read((char*)&f,sizeof(f)).gcount()==sizeof(f)

答案 2 :(得分:3)

您可以使用fread。 (注意API是针对C的,即使网站上说C ++引用:))

答案 3 :(得分:2)

使用fread()中的<stdio.h>。断言应该用实际的错误处理代码替换。

#include <stdio.h>
#include <assert.h>

#define countof(ARRAY) (sizeof (ARRAY) / sizeof *(ARRAY))

float data[5];

FILE *file = fopen("foo.bin", "rb");
assert(file);

size_t n = fread(data, sizeof(float), countof(data), file);
assert(n == countof(data));

请记住,如果您在不同的体系结构之间传输文件,则可能会遇到字节序问题。

答案 4 :(得分:2)

如果文件全部是“浮动”并且您想要多次读取它,那么您只需要这样做:

FILE *fp;

if((fp=fopen("filename.whatever", "rb"))==NULL)
 return 0;

fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fseek(fp, 0, SEEK_SET);

float *f = (float *)malloc(sizeof(float)*size);
if(f==NULL)
{
 fclose(fp);
 return 0;
}

if(fread(f, sizeof(float), size, fp)!=size)
{
 fclose(fp);
 return 0;
}

fclose(fp);

// do something with f

答案 5 :(得分:1)

FILE *thisFile=fopen("filename","fb");
float myFloat;
fscanf(thisFile,"%f",&myFloat);
fclose(thisFile);

如果使用fprintf(特定于实现)写入数据,则此方法有效 但是,你也可以将你的浮动类型转换为int32并保存,加载和类型转换。

std::fstream thisFile;
thisFile.open("filename",ios::read|ios::binary);
float myFloat;
thisFile>>myFloat;
thisFile.close();

可能是错的(我没有使用C ++ F.IO函数来实现loooong loooong时间)

答案 6 :(得分:0)

如果将这些值按顺序放入二进制文件中,则可以将每个浮点值的sizeof(float)字节读取到字符数组中。然后,您可以将它们转换为浮点值。