Я бы разорвал программу в разных задачах.
Первый шаг должен состоять в том, чтобы прочесть пару строк, первую строку, в которой указывается количество чисел для чтения, а затем вторая строка для чтения фактических чисел. Для этого может оказаться полезной функция, называемая 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()
: он должен прочитать две строки. Существует много implementations of reading a full line in C, поэтому вы можете использовать любой из них и сначала прочитать строку, затем sscanf()
/strtoul()
для одного номера (проверьте его возвращаемое значение!). Если у вас есть количество чисел, n
, вы можете прочитать следующую строку в памяти, и сделать:
num->data = malloc(n * sizeof *num->data);
num->len = n;
Вы можете повторно позвонить sscanf()
strtol()
или хранить числа в num->data
. Вы должны ввести чеки, чтобы точно указать n
номеров.
Отметьте, что вы также можете написать read_set()
: прочитайте символ строки по символу и проанализируйте числа по мере их чтения. Это имеет то преимущество, что перехватывать данные только один раз и не требует большого буфера для хранения всей строки ввода в памяти, но недостаток делает сам материал низкого уровня и чтение данных по характеру может быть медленным.
ли Вы должны обратить внимание на линию, или это просто ряд целых чисел, поступающих? В вашем примере это выглядит как нечетные строки - это порядковые номера, а четные - другое. –
Давид Мне нужно обратить внимание на линии. поэтому я не мог этого сделать. Мне нужно прекратить получать новые значения в конце каждой четной строки. Потому что у меня есть структура с идентификаторами атрибутов и списком. Каждая нечетная строка - это идентификатор, а каждая четная строка - это список. Я хочу заполнить структуру двумя строками данных и перейти к другой структуре и заполнить ее еще двумя строками данных и т. Д. – huhuhuuu
Прочитайте по всей строке за раз, а затем просто проанализируйте ее как строку –