我在谷歌上找到的所有内容都是垃圾...请注意,我想要用C写答案,但如果您能提供一个C++解决方案,那么您将获得额外的奖励分数!
我只想从二进制文件中读取一些浮点数到数组中
编辑:是的,我知道字节序的问题...但我不关心它是如何存储的。
我在谷歌上找到的所有内容都是垃圾...请注意,我想要用C写答案,但如果您能提供一个C++解决方案,那么您将获得额外的奖励分数!
我只想从二进制文件中读取一些浮点数到数组中
编辑:是的,我知道字节序的问题...但我不关心它是如何存储的。
从文件中读取浮点数的方式完全取决于首次保存值的方式。一种常见的方式可能是:
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;
}
fread()
而不是包装函数(参见我的答案https://dev59.com/WUnSa4cB1Zd3GeqPNFlf#1422869)- 这个函数存在的唯一原因是为了使用不同参数的物体大小和物体计数来允许批量读取。 - Christophfloat 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)
使用<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));
请记住,如果在不同的架构之间传输文件,可能会遇到字节序问题。
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(实现特定)编写的,则此方法有效。
然而,您也可以将浮点数强制转换为int32并保存、加载和类型转换。
std::fstream thisFile;
thisFile.open("filename",ios::read|ios::binary);
float myFloat;
thisFile>>myFloat;
thisFile.close();