Как определить исключение «число не является вещественным» в Си?

В файле txt необходимо узнать кол-во вещественных чисел, записанных через пробел. Подразумевается, что там должны быть только вещественные числа (данные с датчика). В случае если там оказывается слово, целочисленное, неверная запись, как определить это ? Вот код подсчёта:

    setlocale(LC_ALL, "Rus");
    FILE* file;
    float num;
    int index = 0;

    file = fopen("C:/Users/.../input.txt", "a+");
    if (file  == NULL)
    {
        printf("Ошибка! Недопустимый объект гиперссылки\n");
        return 0;
    }
    else {
       
        while (fscanf(file, "%f", &num) == true) {
            printf("%f\n", num);
            index++;
        }
      
        fprintf(file, "\nКол-во: %d", index);
        fclose(file);
    }
}```

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

fscanf возвращает число прочитанных и присвоеных значений. Не нужно сравнивать его результат с true.

В вашем случае читать числа нужно по одному. Если число не прочитано - значит вы встретили слово или неверный формат. При этом fscanf может не продвинуться по файлу вперёд. Чтобы продвинутся, можно пропустить символы до пробела с помощью fscanf(f, "%*s"). Это чтение без присвоения, мы просто пропускаем хвост неправильного "слова".

fscanf так же может вернуть FEOF. В примере ниже я этого не проверяю, так как есть проверка feof в заголовке цикла. В более сложных случаях проверять нужно отдельно: "неправильный формат" и "конец файла" - это две разные ошибки, которые часто надо обрабатывать по разному.

Ещё одно, не такое ужасное: не работайте с float без веских причин, только double.

Вот пример:

// gcc -Wall -Wextra -std=c99 fscanf_filtering.c
#include <stdio.h>

void scan(FILE *f) {
    while (!feof(f)) {
        double n;
        if (fscanf(f, "%lf", &n) == 1) {
            printf("number %lf\n", n);
        } else {
            printf("failure\n");
            fscanf(f, "%*s");
        }
    }
}

int main() {
    scan(stdin);
}

А это результат для текста 1.23 1.23e2 word 345 34a48e16 15 df. Обратите внимание на число 34. Не уверен что вы хотите его прочитать:

number 1.230000
number 123.000000
failure
number 345.000000
number 34.000000
failure
number 15.000000
failure
failure
→ Ссылка