用文件中的数据填充结构
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()
中变量的所有访问。
此外,
- 请不要在
C
中投射malloc()
和家人的return值。
- 检查
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
读入字符数组!就像现在一样,它是缓冲区溢出的邀请,又名 未定义的行为。
- 不要像
malloc
、free
等使用的那样转换 void *
我正在尝试用文件的数据填充结构。
文件是这样用双点分隔的:
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()
中变量的所有访问。
此外,
- 请不要在
C
中投射malloc()
和家人的return值。 - 检查
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
可能 returnNULL
,文件函数也可能报错。 - 始终限制字符数
fscanf
读入字符数组!就像现在一样,它是缓冲区溢出的邀请,又名 未定义的行为。 - 不要像
malloc
、free
等使用的那样转换void *