[英]How to read a float from binary file in C?
一切我通过谷歌发现是垃圾...请注意,我想在 C中的答案,但是如果你用C ++解决方案补充你的答案,以及那么你获得积分!
我只是想能够从二进制文件中读取一些浮点数到一个数组中
编辑:是的我知道Endian-ness ...而且我不在乎它是如何存储的。
如何从文件中读取浮点数完全取决于值的保存方式。 一种常见的方式可能是:
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;
}
float f;
if(read(fd,&f,sizeof(f))==sizeof(f))
printf("%f\n",f);
else
printf("oops\n");
前提是它被编写为兼容的二进制表示。
read
文件描述符, fread
对于FILE*
S和istream::read
为c++
输入输出流。 选择你喜欢的东西:
read(fd,&f,sizeof(f))==sizeof(f)
fread(&f,sizeof(f),1,fp)==1
fin.read((char*)&f,sizeof(f)).gcount()==sizeof(f)
你可以用fread 。 (注意API是针对C的,即使网站上说的是C ++参考:))
使用<stdio.h>
fread()
。 断言应该用实际的错误处理代码替换。
#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));
请记住,如果在不同体系结构之间传输文件,则可能会遇到endian问题。
如果文件全部“浮动”并且您想要读取X次,那么您只需要这样做:
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
FILE *thisFile=fopen("filename","fb");
float myFloat;
fscanf(thisFile,"%f",&myFloat);
fclose(thisFile);
如果使用fprintf(特定于实现)编写数据,则此方法有效
但是,您也可以将您的float类型转换为int32并保存,加载和类型转换。
std::fstream thisFile;
thisFile.open("filename",ios::read|ios::binary);
float myFloat;
thisFile>>myFloat;
thisFile.close();
可能是错的(我没有使用C ++ F.IO函数来表示loooong loooong时间)
如果将这些值按顺序放入二进制文件中,则可以将每个浮点值的sizeof(float)字节读取到字符数组中。 然后,您可以将它们转换为浮点值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.