在结构内部,有两个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.
}
3条答案
按热度按时间monwx1rj1#
基本的问题是,您正在(仅仅)写入指向文件的指针的值,而不是这些指针所指向的任何数据--结构体的内容。
当你读回它的时候,你只是得到了一个指针,但是这些指针并没有指向任何有用的地方 * 除非 * 你在写指针的同一个进程中做这件事,并且指向的内存仍然活着。
要有效地做到这一点,您需要写出结构体的内容,而不是写出任何指针(它们对保存没有用,因为它们只是分配它们的进程的私有内容)。要读回它,您需要分配内存,然后将文件的内容读入该内存。
krcsximq2#
下面是您的程序的一个版本,它将结构的实际内容写入
charinfo.bin
,而不是它们的地址。此外,我还通过打包结构来处理可能出现的未对齐问题。最后,我想指出的是,我维护了您的命名约定。nuypyhwy3#
通过上面的帮助,我找到了答案。