C语言 如何读写指向二进制文件的结构体指针?

busg9geu  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(121)

在结构内部,有两个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.
}
monwx1rj

monwx1rj1#

基本的问题是,您正在(仅仅)写入指向文件的指针的值,而不是这些指针所指向的任何数据--结构体的内容。
当你读回它的时候,你只是得到了一个指针,但是这些指针并没有指向任何有用的地方 * 除非 * 你在写指针的同一个进程中做这件事,并且指向的内存仍然活着。
要有效地做到这一点,您需要写出结构体的内容,而不是写出任何指针(它们对保存没有用,因为它们只是分配它们的进程的私有内容)。要读回它,您需要分配内存,然后将文件的内容读入该内存。

krcsximq

krcsximq2#

下面是您的程序的一个版本,它将结构的实际内容写入charinfo.bin,而不是它们的地址。此外,我还通过打包结构来处理可能出现的未对齐问题。最后,我想指出的是,我维护了您的命名约定。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define MAX 10

typedef struct  __attribute__((__packed__)) {
    int nDamage;
    int nLife;
} CHARACTER;

void CreatCharacter(CHARACTER pCharMan[], int max) {
    for (int i = 0; i < max; i++)  {
        pCharMan[i].nLife = rand() % 51 + 50;
        pCharMan[i].nDamage = 0;
    }
}

int main() {
    srand((unsigned)time(NULL));
    CHARACTER *pCharMan    = malloc(sizeof(CHARACTER)*MAX);
    CHARACTER *testStruct  = malloc(sizeof(CHARACTER)*MAX);

    CreatCharacter(pCharMan, MAX);

    FILE *fp = fopen("charinfo.bin", "wb");
    fwrite(pCharMan, sizeof(CHARACTER), MAX, fp);
    fclose(fp);

    FILE *op = fopen("charinfo.bin", "rb");
    fread(testStruct, sizeof(CHARACTER), MAX, op);
    fclose(op);

    free(pCharMan);
    free(testStruct);
}
nuypyhwy

nuypyhwy3#

通过上面的帮助,我找到了答案。

#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];
    int nDieHumanArr[MAX];

    CreatCharacter(pCharMan, MAX);
    // ①
    fp = fopen("charinfo.bin", "wb")
    for(int i=0; i<MAX; i++)
        fwrite(pCharMan[i], sizeof(CHARACTER), 1, fp);
    fclose(fp);
    
    // ②
    op = fopen("charinfo.bin", "rb");
    for(int i=0; i<MAX; i++)
        fread(&testStruct[i], sizeof(CHARACTER), 1, op);
    fclose(op);
}

相关问题