Согласно fscanf()
возвращаемое значение:
ISO / IEC 9899: 2017
§ 7.21.6.2 - 16 - Функция fscanf
возвращает значение макроса EOF
, если сбой ввода произошел до завершения первого преобразования (если оно есть). В противном случае функция возвращает количество назначенных элементов ввода, которое может быть меньше предусмотренного или даже равно нулю в случае неудачного раннего сопоставления.
EOF
- это макрос с значение -1
само по себе не различимо по причинам, по которым оно происходит.
Для этого различия § 7.21.6.2 - 19 рекомендует использовать feof()
для конца файла и ferror()
для ошибки ввода / вывода:
ПРИМЕР 3 Принимать повторно от stdin
a количество, единица измерения и имя элемента:
#include<stdio.h>
/*...*/
int count; floatquant;
charunits[21], item[21];
do {
count = fscanf(stdin, "%f%20sof%20s", &quant, units, item);
fscanf(stdin,"%*[^\n]");
} while(!feof(stdin) && !ferror(stdin));
Мой обычный подход при чтении форматированного ввода - проверка введенных значений. Для примера ввода из 2 целых чисел вы можете сделать что-то вроде:
int a, b;
FILE* file;
//open file to read
while(fscanf(file, "%d %d", &a, &b) == 2){ //read each 2 integers in the file, stop when condition fails, i.e. there are nothing else to read or the read input is not an integer
//...handle inputs
}
Этот тип чтения является безопасным и предназначен для всех сценариев сбоя ios, так как он работает для неправильного ввода и для «конца файла».