声明:PTRQ开发问题解决专栏的文章是我在开发中遇到的一些问题,继承他人本着再小的问题也需要有人解答的想法,将这些问题和答案整理出来。
(本文解决方法可能不唯一,欢迎和我讨论问题,同时也欢迎标注转载)
一、嵌套一个结构体
在struct只嵌套了一层结构体的情况下,fread问题很好解决:
(这里前提是使用malloc开辟动态函数空间)
typedef struct Date_Name
{
int year;
int month;
int day;
}Date_Name;
typedef struct Date_Base
{
Date_Name* name_1;//日期名称
int sz;//记录当前有效信息数量
int capacity;//记录当前最大容量
}Date_Base;
void Load_Resource(Date_Base* pc)
{
FILE* pf = fopen("Resource.dat", "r");
if (pf == NULL)
{
perror("LoadResource");
return;
}
//读文件
Date_Name tmp1 = { 0 };
while (fread(&tmp1.year, sizeof(Date_Name), 1, pf))
{
//检测是否需要增容
CheckResource(pc);
pc->name_1[pc->sz] = tmp1;
}
//关闭文件
fclose(pf);
pf = NULL;
}
二、嵌套多个结构体
在stuct嵌套了两个或以上结构体时候,问题就出现了。
由于两个结构体在同一个文件中是接续存储,结构如:
结构体1[0],结构体2[0] |
结构体1[1],结构体2[1] |
结构体1[2],结构体2[2] |
在这样的情况下,fread也必须嵌套读取。
因此在原来while循环的基础上,为第二个嵌套结构体增加了if判断。
当fread读取第二个结构体返回值 != 0时,可以继续原来while循环,否则break退出。
while (fread(&tmp1.year, sizeof(Date_Name), 1, pf))
{
if(fread(&tmp2.context_paragraph, sizeof(Date_Context), 1, pf)!=0)
{
//检测是否需要增容
CheckResource(pc);
pc->name_1[pc->sz] = tmp1;
pc->context_1[pc->sz] = tmp2;
pc->sz++;
}
else
{
break;
}
}
以此类推,为N个嵌套结构体增加判断空间。
三、附记
在fread时候,对指针采用了指向结构体中首元素地址的方式,尽量避免出现内存对齐问题。