该结构体内部有两个 int 数据类型变量(nLife、nDamage)。
通过CreatCharacter()函数分配MAX,并将值插入到nLife和nDamage中。
将输入值保存到二进制文件。
问题是保存的文件没有用fread读取。
奇怪的是,创建二进制文件后立即读取它可以正常工作,但是仅读取它时就会出现问题。
为什么会出现这个问题?
#define MAX 10
typedef struct
{
int nDamage;
int nLife;
} CHARACTER;
int CreatCharacter(CHARACTER* pCharMan[], int max)
{
for (int i = 0; i < max; i++)
{
pCharMan[i] = (CHARACTER*)malloc(sizeof(CHARACTER));
if (pCharMan[i] == NULL)
{
printf("fail\n");
return 0;
}
pCharMan[i]->nLife = rand() % 51 + 50;
pCharMan[i]->nDamage = 0;
}
return pCharMan;
}
void main()
{
FILE* fp, *op;
srand((unsigned)time(NULL));
CHARACTER* pCharMan[MAX];
CHARACTER* testStruct[MAX];
CreatCharacter(pCharMan, MAX);
// ①
//fp = fopen("charinfo.bin", "wb"); // If ① is not commented out, it works normally.
//fwrite(pCharMan, sizeof(CHARACTER*), MAX, fp);
//fclose(fp);
// ②
op = fopen("charinfo.bin", "rb");
fread(testStruct, sizeof(CHARACTER*), MAX, op); // When ① is commented out and only ② is executed, it fails.
fclose(op); // "charinfo.bin" exists.
}
基本问题是您(仅)写入文件指针的值,而不是这些指针指向的任何数据 - 结构的内容。
当您读回它时,您只是得到一个指针,但这些指针不会指向任何有用的地方除非您在刚刚写入指针的同一进程中执行此操作并且指向的内存仍然存在。