我知道我的问题已经被其他人问过了,但是作为C的初学者,
坦率地说,我不理解这些问题的答案。
我目前正在使用Windows,而我的代码是C(我正在使用VS2012)
这是我的文本文件的内容:
Bulwark Fury // Assign this string into player.name
Red Steel // Assign this string into player.title
230 // Assign this string into player.typenclass
21 // Assign this string into player.startstr
2.9 // Assign this string into player.incstr
16 // Assign this string into player.startdex
1.6 // Assign this string into player.incdex
16 // Assign this string into player.startintel
1.7 // Assign this string into player.incintel
44 // Assign this string into player.basemindmg
60 // Assign this string into player.basemaxdmg
1.7 // Assign this string into player.baseattacktime
1.24 // Assign this string into player.basearmor
代码:
typedef struct nodebase
{
char name[20],title[20],type[15],Class[15];
int typenclass;
int startstr;
double incstr;
int startdex;
double incdex;
int startintel;
double incintel;
int basemindmg,basemaxdmg;
double baseattacktime;
double basearmor;
struct nodebase *next;
struct nodebase *curr;
struct nodebase *prev;
}herostat;
static void stat_file(const char *file_name, herostat player)
{
FILE *f = fopen(file_name, "r");// open the specified file
if (f != NULL)
{
int c;
while ((c = fgetc(f)) != EOF)// read character from file until EOF
{
fscanf(f,"%s\n%s\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n",
&player.name, &player.title, &player.typenclass,
&player.startstr, &player.incstr, &player.startdex,
&player.incdex, &player.startintel, &player.incintel,
&player.basemindmg, &player.basemaxdmg,
&player.baseattacktime, &player.basearmor);
}
fclose(f);
}
}
我尝试运行它并打印变量只是为了确保fscanf运行良好,
但是当印刷的是一些随机数字时......
请帮助!
答案 0 :(得分:1)
OP的代码有很多问题
int
。这不仅不起作用,随后在fscanf()
中使用格式也不会消耗.
。解决方案:将浮点数转换为浮点变量。
// int baseattacktime;
double baseattacktime;
// "%d"
"%lf"
c = fgetc(f)
很好奇,不需要。
使用'\n'
不会只扫描换行符,而是任何空格。 %d
无论如何都会跳过领先的空白区域,因此"%d"
与" %d"
相同。
当OP正在阅读文本文件时,建议fopen(file_name, "rt")
。 t
已添加。
格式化语句可能会扫描太多字符。使用%19s
而不是%s
。
OP未检查fscanf()
结果。
OP希望用空格扫描名称。避免使用不扫描空格的%s
。使用%[^\n]
。
打破沉重的fscanf()
会很有用。
如果需要阅读多个玩家,则必须为他们分配空间。
示例代码
typedef struct nodebase {
char name[20],title[20],type[15],Class[15];
int typenclass;
int startstr;
doubel incstr;
int startdex
double incdex;
int startintel;
double incintel;
double basemindmg,basemaxdmg; // Assume these 4 need to be FP
double baseattacktime;
double basearmor;
struct nodebase *next;
struct nodebase *curr;
struct nodebase *prev;
}herostat;
if (f != NULL) {
while (13 == fscanf(f," %19[^\n] %19[^\n]%d" "%d%lf%d" "%lf%d%lf" "%lf%lf%lf%lf",
&player.name, &player.title, &player.typenclass,
&player.startstr, &player.incstr, &player.startdex,
&player.incdex, &player.startintel, &player.incintel,
&player.basemindmg, &player.basemaxdmg,
&player.baseattacktime, &player.basearmor);
// do something with player
}
fclose(f);
}