c - fread 读取文件失败

标签 c struct fread

我这里有一个嵌套结构。

typedef struct 
{
    struct_one    one;  
    struct_two    two;
    struct_three  three;
} outermost_struct;

在函数中传递指向外部结构的指针

outermost_struct settings
readFileInStruct(settings_file, &settings)

我的函数读取结构体中的bin文件

int readConfigIn2Struct
(
    char file_name[],
    outermost_struct*settings_mem_location
)
{
    FILE *ptr_file;
    ptr_file = fopen(file_name,"rb");
    if(ptr_file == NULL)
    {
        return -1;
    }
    fread(&(*settings_mem_location),sizeof(outermost_struct),1,ptr_file);
    fclose(ptr_file);
    return 0;
}

这里fread失败并返回到main函数。谁能告诉我为什么我的恐惧失败了?该文件的大小为 73kb,struct 有足​​够的内存来容纳整个文件。

现在,我不再对整个文件执行一次 fread,而是尝试对每个结构执行 fread。 fread(&(*settings_mem_location),sizeof(struct_one),1,ptr_file);

此处 fread 正确写入 struct_one。现在我需要 fread 写入 struct_two。如何将指针前进到指向 struct_two?

最佳答案

详细的错误检查和日志记录是免费调试的。除此之外,包括额外的日志记录通常会有所帮助。

下面是您显示的代码的可能版本,反射(reflect)了我上面的陈述:

int readConfigIn2Struct (
  char file_name[],
  outermost_struct * settings_mem_location)
{
#ifdef DEBUG      
  fprintf(stderr, "%s:%d - Entering %s with file_name = '%s', outermost_struct * = %p\n",
    __FILE__, __LINE__, __func__, file_name, (void*) settings_mem_location);
#endif

  assert(NULL != file_name);
  assert(NULL != settings_mem_location);

  int result = 0; /* be optimistic. */

  FILE *ptr_file = fopen(file_name, "rb");
  if (ptr_file == NULL)
  {
    result = -1;
  }
  else
  {
    size_t bytes_to_read = sizeof * settings_mem_location;
#ifdef DEBUG
    fprintf(stderr, "Bytes to read from '%s': %zu\", file_name, bytes_to_read);
#endif
    size_t bytes_read = fread(settings_mem_location, 1, bytes_to_read, ptr_file);

    if (bytes_read < bytes_to_read)
    {
      result = -1;

      if (feof(ptr_file))
      {
        fprintf(stderr, "Unexpectedly reached EOF after %zu bytes\", bytes_read);
      }
      else if (ferror(ptr_file))
      {
        fprintf(stderr, "An error occurred after reading %zu bytes\", bytes_read);
      }
    }

    fclose(ptr_file);
  }

#ifdef DEBUG
  fprintf(stderr, "%s:%d - Leaving %s with result = %d\n", __FILE__, 
    __LINE__, __func__, result);
#endif

  return result; /* One exit point per function is preferred over several. */
}

使用选项-DDEBUG进行编译以启用额外的日志记录,例如进入和退出。

要删除对 assert() 的调用,请使用选项 -DNDEBUG 自动编译。

Details about assert() are in the documentation here.

关于c - fread 读取文件失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50275090/

相关文章:

c - 如何理解汇编级别的原子 test_and_set?

c - 随机字符奇怪的定义行为

c - 出现错误时安全退出到特定状态

c - 读/写结构到套接字

将整数常量转换为指针类型

C - 当程序读取文件时,不会注意到对文本文件所做的更改

c++ - 对静态常量结构的 undefined reference

c++ - 使用 fread 读取二进制文件时无法获得正确的元素数

C、从bin文件中读取二进制文件

r - fread中的空白未被识别为NA