Очевидно, fscanf_s()
нужен параметр размера после адреса переменной
fscanf_s(fp, "%c;%d-%d\n", &axis, 1, &minSpeed, &maxSpeed);
/* extra 1 for the size of the ^^^ axis array */
Но я предлагаю вам не использовать функции *_s
: они хуже, чемфункции с простыми именами - они требуют одинаковых проверок и позволяют вам чувствовать себя в безопасности, когда это не так.Я предлагаю вам не использовать их из-за ложного чувства безопасности и того факта, что они недоступны во многих реализациях, из-за чего ваши программы работают только на ограниченном подмножестве возможных машин.*
fscanf(fp, "%c;%d-%d\n", &axis, &minSpeed, &maxSpeed);
/* fscanf(fp, "%1c;%d-%d\n", &axis, &minSpeed, &maxSpeed); */
/* default 1 ^^^ same as for fscanf_s */
И использование feof()
неверно.
fscanf()
возвращает EOF при возникновении ошибки (ошибка конца файла или совпадения или ошибка чтения ...).
Вы можете использовать feof()
, чтобы определить причину сбоя fscanf()
, а не проверить, произойдет ли сбой при следующем вызове.
/* pseudo-code */
while (1) {
chk = fscanf();
if (chk == EOF) break;
if (chk < NUMBER_OF_EXPECTED_CONVERSIONS) {
/* ... conversion failures */
} else {
/* ... all ok */
}
}
if (feof()) /* failed because end-of-file reached */;
if (ferror()) /* failed because of stream error */;