Как определить исключение «число не является вещественным» в Си?
В файле 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 шт):
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