【问题标题】:How to read a float from binary file in C?如何从 C 中的二进制文件中读取浮点数?
【发布时间】:2009-09-15 02:48:25
【问题描述】:

我通过谷歌找到的所有东西都是垃圾......请注意,我想要 in C 的答案,但是如果你用 C++ 解决方案补充你的答案 以及然后你得到奖励积分!

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

编辑:是的,我知道 Endian-ness……不,我不在乎它是如何存储的。

【问题讨论】:

  • 这些浮点数究竟以什么格式存储?
  • 这就是我喜欢 StackOverflow 的原因......我只等了几分钟,我已经有 5 个答案比其他任何答案都好。
  • 你不关心浮点数是如何存储的,但你需要有人告诉你一些基本的东西,比如如何从二进制文件中读取???
  • 是的,对不起,我没有记住每个 C API -_-

标签: c++ c file-io


【解决方案1】:

如何从文件中读取浮点数完全取决于这些值最初是如何保存在那里的。一种常见的方法可能是:

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;
}

【讨论】:

  • 谢谢你,我不知道为什么我在谷歌上找到的其他人很难写出这么简单的声明。我向上帝发誓,人们就像把事情搞得更复杂一样。
  • 请注意,如果您跨平台移动文件,字节顺序在这里很重要。
  • 我相信任何 x86 或 x64 都将具有相同的字节序……对吗?
  • 如果我想从文件中读取固定数量的浮点数该怎么办?谢谢
  • @Polaris878:调用该函数固定次数?
【解决方案2】:
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++ iostreams。选你喜欢的:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 请记住,根据浮点数是否由具有不同字节序的机器写入,您可能需要在读取后重新排序字节。
    【解决方案4】:

    使用<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));
    

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

    【讨论】:

      【解决方案5】:

      如果文件全是“浮动”文件,并且您想读取它 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
      

      【讨论】:

        【解决方案6】:
        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 函数了)

        【讨论】:

        • O.P.要求提供二进制格式的文件。这提供了 Ascii 中的文件,更易于阅读,但不是所要求的。对不起。
        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-02
          相关资源
          最近更新 更多