Я бы разбил программу на разные задачи.
Первый шаг - это возможность прочитать пару строк, первая строка, которая сообщает количество прочитанных чисел, а затем вторая строка.читать реальные цифры.Для этого может быть полезна функция с именем вроде read_set
.Он должен быть в состоянии возвратить прочитанные числа и сигнал конца файла, а также ошибки.Для этого мы можем определить структуру данных, такую как:
struct numbers {
long *data; /* or choose a type depending upon your needs */
size_t len;
};
, а затем мы можем объявить нашу функцию с прототипом:
int read_set(FILE *fp, struct numbers *num);
Функция будет выделять память для num->data
и установите num->len
на правильное значение.В случае успеха возвращается 0, а в противном случае - набор условий ошибки.Мы могли бы проявить фантазию и использовать enum
для возврата статусов позже.А теперь давайте предположим, что 0 = успех, 1 = конец файла, а все остальное является ошибкой.
Затем вызывающий вызов вызывает read_set()
в цикле:
struct numbers numbers;
int status;
while ((status = read_set(fp, &numbers)) == 0) {
/* process numbers->data, and then free it */
}
if (status == 1) {
/* hit end of file, everything is OK */
} else {
/* handle error */
}
ДляРеализация read_set()
: она должна прочитать две строки.Существует множество реализаций чтения полной строки в C , поэтому вы можете использовать любую из них и сначала прочитать строку, затем sscanf()
/ strtoul()
для одного числа (проверьте возвращаемое значение!).Если у вас есть количество чисел, n
, вы можете прочитать следующую строку в памяти и выполнить:
num->data = malloc(n * sizeof *num->data);
num->len = n;
Затем вы можете повторно вызывать sscanf()
или strtol()
для сохранения номеров в num->data
.Вы должны поставить галочки, чтобы убедиться, что в этой строке точно находятся n
числа.
Обратите внимание, что вы можете написать read_set()
и другими способами: читать строку за символом и анализировать числа по мере необходимости.читать их.Преимущество этого состоит в том, что вы просматриваете данные только один раз и не нуждаетесь в большом буфере для хранения всей входной строки в памяти, но недостатком является то, что вы выполняете низкоуровневые операции самостоятельно, а посимвольное чтение данных может быть медленным.