Как хранить неизвестное количество номеров
То, что я пытаюсь сделать, это прочитать из файла, который имеет только положительные целые числа, затем отсортировать целые числа и вывести их.
Проблема в том, что я не знаю, сколько строк (каждая строка имеет номер) будет иметь файл, из которого я пытаюсь прочитать.
Есть ли способ сохранить цифры в регистрах адресов / данных, хотя я не знаю, сколько их будет?
РЕДАКТИРОВАТЬ: собираюсь объяснить немного больше. Файл данных, вероятно, будет иметь менее 14 входов. Вопрос в том, как я смогу поместить <14 чисел в разные регистры без жесткого кодирования каждого отдельного регистра?
1 ответ
Если вы читаете из файла, ОС предложит вам "Проверка конца файла". Если вы читаете построчно, легко считать строки; общее количество строк, отображаемое счетчиком строк при проверке EndOfFile.
Чтобы сохранить этот набор чисел, вам, вероятно, нужен непрерывный блок памяти, который достаточно велик. Вы можете заранее определить максимальный размер и просто объявить статически достаточно большой буфер.
Альтернативой является динамическое выделение памяти (см. Обращения к Malloc или чему-то подобному, предлагаемому ОС) для хранения некоторого количества, большего, чем вы ожидаете, и заполнения значений в этом пространстве до его заполнения. Если в файле есть что-то еще, выделите больший кусок, скопируйте значения, собранные так далеко от старого, освободите старый и продолжите. Простое правило состоит в том, чтобы изначально выделять то, что вы думаете, в 2 раза больше среднего значения, которое вы ожидаете (например, если вы думаете, что файлы обычно содержат 100 значений, вы могли бы изначально выделить буфер из 150 слотов) для обработки большинства случаев только с начальное распределение. Если вам нужно перераспределить, то удвойте размер последнего выделенного буфера (например, переключитесь на 300, 600, ...). Это сохраняет перераспределение накладных расходов очень низким.
Третий вариант - собрать ваши значения в набор буферов фиксированного размера (например, выделить 100 слотов для каждого нового блока) и заполнить их по мере чтения. Теперь у вас есть набор буферов (вы можете связать их в линейный список или создать массив для отслеживания их, используя технику из предыдущего абзаца). Это имеет обратную сторону, усложняя ваш вид, поэтому я не думаю, что это лучший метод.