DredWulf
@DredWulf

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

В файле txt необходимо узнать кол-во вещественных чисел, записанных через пробел. Подразумевается, что там должны быть только вещественные числа (данные с датчика). В случае если там оказывается слово, целочисленное, неверная запись, как определить это ? Вот код подсчёта:
void main() {
    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);
    }
}
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
printf(file, "\nОшибка, недопустимые значения");

он записал обрывок сообщения:
"стимые значения"
а почему?

Потому что у printf первый аргумент -- строка, а не файл.

fprintf(file, "\nОшибка, недопустимые значения");

А вот этим ты свой исходный файл испортил.

И до кучи
fscanf(file, "%f", &num) == true

проверяй на == 1. fscanf возвращает число (отсканированных полей), а не признак успеха.
Ответ написан
CityCat4
@CityCat4
Если я чешу в затылке - не беда!
Я не слишком люблю потоковый ввод-вывод, поэтому всегда с небольшими файлами работаю по одной схеме - проверил наличие-получил размер-запросил память- прочитал- закрыл.
А дальше работа по такой схеме:
Нашел пробел, запомнил место, ляпнул сюда '\0'
От текущего места до запомненного сделал sscanf() (чтобы не греть голову распознаванием формата вещественного числа, а напрячь этим stdio).
Если sscanf не вернул ошибки - это вещественное число и счетчик ++, иначе счетчик не трогаем.
Текущее место перенес на один байт дальше, чем запомненное.
Вернулся к поиску пробела, если строка не кончилась
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы