Подробная проверка ошибок и ведение журнала отлаживаются бесплатно. Вдобавок к этому, в том числе, дополнительное ведение журнала помогает.
Ниже приведена возможная версия кода, который вы показываете, отражая мои утверждения выше:
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()
находится в документации здесь.