我对fgets有一个非常奇怪的行为:
FILE *config;
config = fopen("config.txt", "r");
int health, weapon, speed;
char search[50];
while (fgets(search ,sizeof(search), config) != NULL)
{
fscanf(config, "health: %d", &health);
fscanf(config, "weapon: %d", ¤t_weapon);
fscanf(config, "speed: %d", &speed);
}
fclose(config);
printf("%i", speed); //prints 0
config.txt的:
health: 350
weapon: 1
speed: 20
如果我改变
fscanf(config, "speed: %d", &speed);
与
fscanf(config, "wordThatDoesntStartWithS: %d", &speed);
效果很好。 为什么呢?
答案 0 :(得分:2)
你的代码非常奇怪。
fgets()
的要点是阅读整行文字。然后你不需要使用fscanf()
,它从流中读取:你已经读过一行。使用sscanf()
处理您刚读过的行。
此外,您需要检查sscanf()
是否成功,并且(当然)您不能期望从同一行扫描所有三种不同的东西:
char line[1024];
bool got_speed = false, got_health = false, got_weapon = false;
while(fgets(line, sizeof line, config) != NULL)
{
if(!got_speed && sscanf(line, "speed: %d", &speed) == 1)
got_speed = true;
if(!got_health && sscanf(line, "health: %d", &health) == 1)
got_health = true;
if(!got_weapon && sscanf(line, "weapon: %d", &weapon) == 1)
got_weapon = true;
}
以上内容可以重构,以便将&&
的右侧分配给相应的got_
- 旗帜。