Вот способ, который никто другой не предложил, который не использует fscanf
, поэтому вы можете иметь вменяемую обработку ошибок:
char buffer[BUFSIZE];
size_t size = 5;
int *data = malloc(size * sizeof *line);
if(line == NULL) error();
while(fgets(buffer, sizeof buffer, fp)
{
size_t i = 0;
char *next = buffer;
while(*next && *next != '\n')
{
data[i++] = strtol(next, &next, 0);
// check for errors
}
}
По сути, вместо попытки использовать *scanf
'* "%d"
чтобы читать символы, используйте функцию, которую она (вероятно) вызывает для преобразования: strtol
.Где *scanf
проходит через строку, чтобы соответствовать строке формата, но не позволяет вам «сохранить свое место» между вызовами функций, strtol
делает, что вам нужно для чтения произвольного числа целых чисел.
Я написал не весь ваш код для вас - вы должны выполнить сложную обработку ошибок.Возможные ошибки:
i == size
, в этом случае вы можете попытаться увеличить data
с помощью realloc
.С другой стороны, вы можете перебрать буфер и посчитать, сколько чисел существует заранее, а затем распределить их так, чтобы вам не нужно было перераспределять их позже. fgets
не прочитал всю строку (проверьте, чтопоследний символ перед '\0'
является '\n'
).В этом случае вы, вероятно, захотите заполнить буфер и продолжить чтение чисел.Будьте осторожны в этом случае - вам, вероятно, придется вернуться и пересчитать последнее число - fgets
могло бы его обрезать.(Это один из недостатков использования fgets
.) - Ошибочный ввод - обрабатывайте как хотите.