Фред не может прочитать файл - PullRequest
0 голосов
/ 10 мая 2018

У меня здесь есть структура гнезд.

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 терпит неудачу и возвращается к основной функции. Кто-нибудь может сказать мне, почему у меня не получается перечитать? Размер файла составляет 73 КБ, а структура имеет достаточно памяти, чтобы вместить весь файл.

Теперь вместо того, чтобы делать один раз фред для всего файла, я пытаюсь сделать фред для каждой структуры. Fread (& (* settings_mem_location), SizeOf (struct_one), 1, ptr_file);

Здесь fread правильно пишет в struct_one. Теперь мне нужно fread для записи в struct_two. Как мне продвинуть указатель, чтобы он указывал на struct_two?

1 Ответ

0 голосов
/ 11 мая 2018

Подробная проверка ошибок и ведение журнала отлаживаются бесплатно. Вдобавок к этому, в том числе, дополнительное ведение журнала помогает.

Ниже приведена возможная версия кода, который вы показываете, отражая мои утверждения выше:

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.

Подробная информация о assert() находится в документации здесь.

...