Перебрать файл и прочитать все записи - PullRequest
0 голосов
/ 07 марта 2019

У меня есть файл с несколькими записями.Каждая запись содержит тип (число двоичного значения), len (снова значение bin) и данные (двоичное значение, длина которого равна 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 голосов
/ 07 марта 2019

Идея состоит в том, чтобы каждый раз проверять возвращаемое значение 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!
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...