我这里有一个嵌套结构。
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?
答案 0 :(得分: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
自动编译。