c - 循环遍历文件并读取所有记录

标签 c file loops struct binary

我有一个包含多条记录的文件。每条记录包含一个类型(一个二进制值数字)、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;
}

如何循环遍历文件并打印每条记录。

最佳答案

想法是每次检查fread的返回值,如果返回值小于预期,则检查feof()以查看是否到达文件末尾。您可以通过谷歌“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!
  }

关于c - 循环遍历文件并读取所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55035324/

相关文章:

c - 当字符串相等时 strcmp() 不返回 0

c - 如何将字符从数组复制到用户在 C 中创建的文件

php - 保护PDF文档不被URL直接访问

c - 在C语言中与初学者级别的循环函数苦苦挣扎

c - 从文件中读取并将格式化的行输入到链接列表中。 C

来自 ICC 的 _PGOPTI_Prof_Dump_All() 的 Clang 或 GCC 等价物

git - 从 GitHub 存储库下载单个文件夹或目录

javascript - 如何在 setTimeout 中维护循环变量的值? JavaScript

javascript 如果将 .shift() 与数组的最后一个值进行比较不起作用

c - 了解包含大量数字的链表