Во-первых, fgetc
возвращает int
, поэтому c
должно быть int
.
Кроме этого, я бы использовал немного другой подход.Я признаю, что это немного слишком сложно.Тем не менее, этот подход может быть использован, если у вас есть несколько различных типов полей, требующих различных действий, таких как анализатор.Для вашей конкретной проблемы я рекомендую ответ Джохатана Леффлера.
int c=fgetc(f);
while(c!=EOF && i<300) {
if(isdigit(c)) {
fseek(f, -1, SEEK_CUR);
if(fscanf(f, "%d", &list[i++]) != 1) {
// Handle error
}
}
c=fgetc(f);
}
Здесь меня не интересуют запятые и переводы строк.Я беру НИЧЕГО кроме цифры в качестве разделителя.В основном я делаю следующее:
read next byte
if byte is digit:
back one byte in the file
read number, irregardless of length
else continue
Дополнительное условие i<300
по соображениям безопасности.Если вы действительно хотите проверить это, кроме запятых и новых строк (у меня не сложилось впечатление, что вы считаете это важным), вы можете легко добавить else if (c == ...
для обработки ошибки.
Обратите внимание, что вам следуетвсегда проверяйте возвращаемое значение для таких функций, как sscanf
, fscanf
, scanf
и т. д. На самом деле, вы также должны делать это для fseek
.В этой ситуации это не так важно, так как этот код вряд ли потерпит неудачу по этой причине, поэтому я оставил его для удобства чтения.Но в рабочем коде вы ДОЛЖНЫ проверить это.