Как проверить ошибки fscanf в C - PullRequest
0 голосов
/ 11 марта 2012

У меня есть такая таблица;

01 01 02 00 01 02 00 01
01 02 00 01 02 00 01 02
02 00 11 04 04 04 04 04
00 01 10 03 03 03 03 03

Я читаю этот файл так:

FILE *map = open_file("lazy.map");
if (map == 0)
    return 0;

for (i = 0; i < TOTAL_TILES; ++i) {
    int ttype;
    fscanf(map,"%i",&ttype);
    // do other stuff here...
}

Есть ли способ проверить, не удалось ли fscanf или нет?

Ответы [ 3 ]

2 голосов
/ 11 марта 2012

Проверьте возвращаемое значение.

Другой вариант - использовать %n формат:

int n = -1;
int ttype;
fscanf(map, "%i%n", &ttype, &n);
if(-1 == n)
    // failed to parse

Таким образом, вы можете проверить, сколько символов было использовано fscanf. Это не имеет значения в выше, но в:

int count = fscanf(map, "%i abc %n", &ttype, &n);

count может быть больше единицы, даже если abc часть формата не совпадает. С другой стороны, n будет установлен только в случае совпадения всего формата.

1 голос
/ 11 марта 2012

Да: вы можете проверить его возвращаемое значение. За http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html:

После успешного завершения эти функции должны возвращать количество успешно сопоставленных и назначенных элементов ввода; это число может быть нулевым в случае неудачного раннего сопоставления. Если ввод заканчивается до первого неудачного или конверсионного совпадения, EOF должен быть возвращен. Если происходит ошибка чтения, устанавливается индикатор ошибки для потока, должен быть возвращен EOF, и errno должен быть установлен для указания ошибки.

(на этой странице помечается последняя часть ", и errno должен указывать на ошибку", поскольку это зависит от POSIX, что означает, что сам стандарт C не требует, чтобы errno должно быть установлено, но все остальное требуется стандартом C.)

0 голосов
/ 11 марта 2012

Да. От C ++ ссылка :

Возвращаемое значение

В случае успеха функция возвращает количество элементов успешно прочитал. Этот счет может соответствовать ожидаемому количеству показания или быть меньше, даже ноль, в случае сбоя сопоставления. В случай сбоя ввода до того, как какие-либо данные могут быть успешно читать, EOF возвращается.

...