如何从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文件描述符, read FILE* s和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) 

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

使用 fread() 。 断言应该用实际的error handling代码替换。

 #include  #include  #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问题。

如果文件全部“浮动”并且您想要多次读取它,那么您所要做的就是:

 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)字节读取到字符数组中。 然后,您可以将它们转换为浮点值。