【问题标题】:Reading a binary file with fread用 fread 读取二进制文件
【发布时间】:2021-01-25 10:58:49
【问题描述】:

我正在尝试使用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;
}

【问题讨论】:

  • 这能回答你的问题吗? Why is “while ( !feof (file) )” always wrong?
  • fread的结果是否等于sizeof(data)
  • 如果文件包含一百万个数据集,那么包含 1000 个项目的数组将不足以存储这些数据。
  • 顺便说一句:这可能不是this的重复,可能还有其他不相关的问题

标签: c fread bin


【解决方案1】:

你可能想要这样的东西:

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),否则发生读取错误。

但二进制文件本身也可能存在问题,具体取决于它的生成方式。看看那个代码会很有帮助。

【讨论】:

  • 仍然while (!feof(fp)); 并不完全正确。它不包括读取错误
  • @IngoLeonhardt 解释添加
猜你喜欢
  • 2015-08-22
  • 2019-04-13
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2016-04-19
  • 2020-07-11
  • 1970-01-01
相关资源
最近更新 更多