Существует несколько подходов:
- укажите максимальный размер, который вы можете обработать, затем вы просто выделяете его один раз (как глобальный, так и в куче).
- обрабатывайте файл порциями, если вы беспокоитесь о том, чтобы поместить его в память сразу.
- обрабатывает произвольный размер, используя
malloc
с realloc
(когда вы читаете биты).
Номер 1 легко:
static char buff[900001]; // or malloc/free of 900000
count = fread (buff, 1, 900001, fIn);
if (count > 900000) // problem!
Номер 2, вероятно, лучший способ сделать это, если вам абсолютно не нужно , требующий всего файла в памяти сразу. Например, если ваша программа считает количество слов, она может последовательно обрабатывать файл по несколько килограмм за раз.
Номер 3, вы можете поддерживать переменные buffer
, used
и max
. Изначально установите max
на 50 КБ и выделите buffer
в качестве этого размера.
Затем попробуйте прочитать один блок 10K в фиксированный буфер tbuff
. Сложите текущее значение used
и количество считанных байтов в tbuff
и, если оно больше max
, выполните realloc
, чтобы увеличить buffer
еще на 50 КБ (одновременно корректируя max
) .
Затем добавьте tbuff
к buffer
, отрегулируйте used
, промойте и повторите. Обратите внимание, что все эти значения (10K, 50K и т. Д.) Являются только примерами. В зависимости от ваших потребностей вы можете использовать разные значения.