2013-11-21 3 views
-2

У меня есть очень странное поведение с fgets:fscanf не находит слово, которое начинается с с

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); 

хорошо работает. Почему?

+3

Я не понимаю, почему у вас есть scanfs в цикле с fgets. –

+0

Что такое 'cerca'? Где это объявлено? –

+0

Я исправил небольшие проблемы в вашем примере (неправильные имена переменных), и он работает для меня с «скоростью» и НЕ с «wordThatDoesntStartWithS» – Vorsprung

ответ

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_-флагов.

Смежные вопросы