fscanf找不到以s开头的单词

时间:2013-11-21 15:22:21

标签: c

我对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", &current_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);

效果很好。 为什么呢?

1 个答案:

答案 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_ - 旗帜。