首页 文章

fread无法读取文件

提问于
浏览
-1

我这里有一个嵌套结构 .

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

将指针传递给函数中的外部结构

outermost_struct settings
readFileInStruct(settings_file, &settings)

我的函数在struct中读取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失败并返回主函数 . 谁能告诉我为什么我的畏惧失败? teh文件的大小为73kb,struct有足够的内存来容纳整个文件 .

现在不是为整个文件做一次fread,而是试图为每个结构做fread . 的fread(&(* settings_mem_location)的sizeof(struct_one),1,ptr_file);

这里fread正确写入struct_one . 现在我需要fread写入struct_two . 如何将指针前进指向struct_two?

1 回答

  • 0

    详细的错误检查和日志记录是免费调试的 . 除此之外,包括额外的日志记录主要有帮助 .

    在您显示的代码的可能版本下方,反映了我上面的陈述:

    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.

相关问题