使用文件

时间:2015-07-07 21:42:26

标签: c file pointers struct segmentation-fault

我试图用文件数据填充结构。

文件用双点分隔,如下所示:

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;

}

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

2 个答案:

答案 0 :(得分:2)

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

typedef struct Character *Personaje;

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

  Personaje *salida 

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

typedef struct Character Personaje;

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

另外,

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

答案 1 :(得分:1)

提示:不要对指向结构的指针进行类型转换,而是对结构本身进行类型转换。这更容易混淆,并且将完全避免您在此处遇到的问题:仅为指针而不是结构分配空间。

您还要定义Character **

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

所以:使用给定的类型定义:

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

注意:在*salida中使用sizeof会使此字词与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可能会返回NULL,文件函数也可能会报告错误。
  • 始终将字符数fscanf限制为char数组!就像现在一样,它是缓冲区溢出的邀请,又名未定义的行为
  • 请勿void *malloc等使用free