循环浏览文件并读取所有记录

时间:2019-03-07 02:53:11

标签: c file loops struct binary

我有一个包含多个记录的文件。每个记录包含一个类型(一个二进制值数字),len(再次为bin值)和一个data(长度为len的二进制值)。该文件包含多个记录。我想打印包含它自己的类型,len和数据的每条记录。

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

typedef struct file_s {
  int16_t type;
  int32_t length;
  // Assumption: Each record is 16 bits
  // For a record size of 32 bits, use int32_t*
  int16_t* data;
} file_s;

int main() {
  file_s file;
  FILE* f = fopen("file.bin","r");
  if (f == NULL) {
    perror("Error");
    return 1;
  }
  fread(&file.type, sizeof(file.type), 1, f);
  fread(&file.length, sizeof(file.length), 1, f);
  file.data = malloc(file.length * sizeof(*file.data));


  fread(file.data, sizeof(*file.data), file.length, f);
  fclose(f);
  // Process the data
  /* ... */
  free(file.data);
  return 0;
}

如何循环浏览文件并打印每条记录。

1 个答案:

答案 0 :(得分:-1)

这个想法是每次检查fread的返回值,如果返回值小于期望值,则检查feof()以查看是否到达文件末尾。您可以通过Google“ man fread”和“ man feof”检查手册页。您可以使用do while循环遍历文件。

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
int feof(FILE *stream);

类似:

  while(1) {
      size_read = fread(&file.type, sizeof(file.type), 1, f);
      if(size_read!=1 || feof(f))
          break;
      fread(&file.length, sizeof(file.length), 1, f);
      //do the same check
      file.data = malloc(file.length * sizeof(*file.data));

      fread(file.data, sizeof(*file.data), file.length, f);
      //do the same check, remember to free the memory!
  }