用文件中的数据填充结构

Filling struct with data in file

我正在尝试用文件的数据填充结构。

文件是这样用双点分隔的:

string1:15

当我读取文件并用数据填充结构的字段时,出现了分段错误。

这里是结构文件character.h:

#ifndef CHARACTER_H_
#define CHARACTER_H_

typedef struct Character *Personaje;

struct Character{
        char name[20];
        int lvl;
};


extern void saveCharacter(char *name, int lvl);
extern Personaje *getCharacter();
extern char *toString(Personaje *pj);
#endif

这里是源文件中的函数character.c:

Personaje *getCharacter(){
        FILE *fp;
        Personaje *salida = (Personaje*) malloc(sizeof(Personaje));
        fp = fopen("kprct", "rb");

        fscanf(fp, "%[A-Za-z]:%d", (*salida)->name, &((*salida)->lvl));
        printf("Linea: %s : %d\n", (*salida)->name, (*salida)->lvl);

        fclose(fp);
        return salida;

}

如何用文件数据填充结构?

我认为,这里的主要问题是

typedef struct Character *Personaje;

这样,您已经将 Personaje 作为指针,并且在代码中,您正在编写

  Personaje *salida 

创建一个指向指针的指针。这不是必需的,我认为也不是您想要的。我建议,将 typedef 更改为

typedef struct Character Personaje;

以及对fscanf()printf()中变量的所有访问。

此外,

  1. 请不要在C中投射malloc()和家人的return值。
  2. 检查 fopen()fscanf() 的 return 值以确保成功。

提示:不要对指向结构的指针进行类型转换,而是对结构本身进行类型转换。这不会那么令人困惑,并且可以完全避免您在这里面临的问题:只为指针分配 space,而不是结构。

你还定义了一个Character **:

Personaje *salida = (Personaje*) malloc(sizeof(Personaje));

因此:使用给定的类型定义:

Personaje salida = malloc(sizeof(*salida));

注意:在 sizeof 中使用 *salida 使该术语独立于 salida 的类型。

你的代码的其余部分也被破坏了,因为你的函数在涉及 Personaje 的地方也有一个 * 太多了。

正确的定义是:

typedef struct {
        char name[20];
        int lvl;
} Personaje;     // or name the type just Character

然后,对于原型,使用您已有的 Personaje *malloc 行将是:

Personaje *salida = malloc(sizeof(*salida));

(注意:我不必更改 sizeof() 参数。)

其他问题:

  • 始终 检查系统函数的结果,因为它们可能会报告错误。 malloc 可能 return NULL,文件函数也可能报错。
  • 始终限制字符数fscanf读入字符数组!就像现在一样,它是缓冲区溢出的邀请,又名 未定义的行为
  • 不要像 mallocfree 等使用的那样转换 void *