fscanf C - определяющая буква вместо числа - PullRequest
2 голосов
/ 31 марта 2011

Я загружаю матрицу из файла, и тут возникает вопрос, как лечить, если в загрузке файла будет ошибка, если вместо номера будет буква?Я особенно спрашиваю - как определить, что я загрузил письмо?

Thx

Ответы [ 2 ]

3 голосов
/ 31 марта 2011

Если входное значение, считанное fscanf(), не соответствует ожидаемому типу (как определено спецификатором преобразования), об этом будет сообщено возвращаемым значением fscanf() (которое равно числу спецификаторов покрытия успешно прочитано).

int x;   
if ( fscanf( file, "%d", &x ) != 1 )
{
    // input was not a number
}

В целом, все семейство функций scanf() в основном предназначено для чтения тривиальных данных, разделенных пробелами. Обычно проще и надежнее читать всю строку (используя fgets()), а затем выполнять внутренний анализ. (strtol() и strtod() могут быть здесь полезны, но strtok() следует использовать с осторожностью, особенно в многопоточной среде.)

2 голосов
/ 31 марта 2011

Не fscanf().

fgets() и sscanf().

В случае ошибки у вас все еще есть исходные данные для восстановления после ошибки (или для отображения пользователюили что угодно)

И всегда проверяйте возвращаемое значение семейства функций scanf.

if (fscanf(stdin, "%d", &var) != 1) { /* oops */ }

if (fgets(buf, sizeof buf, stdin) == NULL) { /* oops */ }
if (sscanf(buf, "%d", &var) != 1) { /* oops */ }
...