用 fread 读取二进制文件

问题描述

我正在尝试使用 fread 读取垃圾箱? .我正在阅读的二进制文件有 100 万组数据。但是我只得到 600+ 并且读取的数据是 0-1.#QNAN0。我是否以正确的方式使用 fread

struct Data {
    float time;
    float signal1;
    float signal2;
    float signal3;
};

long i;
static struct Data data[1000]; //(Solve by using static)

long openfile() {

  FILE *fp;
  char* filename = "Test_0012.bin";

  fp = fopen(filename,"rb");
  if (fp == NULL){
      printf("Could not open file %s",filename);
      return 1;
  }

  while(!feof(fp)){
    fread(&data,sizeof(data),1,fp);

    printf("%d\t",i);
    printf("%f\t",data[i].time);
    printf("%f\t",data[i].signal1);
    printf("%f\t",data[i].signal2);
    printf("%f\n",data[i].signal3);

    i++;
  }
  fclose(fp);
  return i;
}

解决方法

你可能想要这样的东西:

int i = 0;
do
{
  fread(&data[i],sizeof(struct Data),1,fp);
} while (!feof(fp));

您想要读取 struct Data 大小的 n 倍,而不是一次读取整个数组。

顺便说一句,您还需要检查是否有不超过 1000 个(等于 sizeof(data)/sizeof(data[0]) 个条目,并且您需要检查 fread 返回的值是否与您输入的元素数相同)要求读取(在本例中为 1),否则发生读取错误。

但二进制文件本身也可能有问题,这取决于它是如何生成的。看看那个代码会很有帮助。