Это текстовый файл (не двоичный) и не в фиксированном формате, верно?В противном случае было бы легко вычислить размер массива из размера файла (buffer_size = file_size / record_size
, размер буфера в словах (размер целого числа), другие размеры в байтах).
Вот чтоЯ бы сделал (но я немного сумасшедший, когда дело доходит до прикладной статистики).
1) Какое максимальное количество символов (или байтов) число (или запись) будет занимать вфайл, не забудьте включить символы конца строки (CR, NF) и другие пустые глифы (пробелы, табуляции и т. д.)?Если вы уже можете оценить, какой будет средний размер записи, то еще лучше, вы используете это вместо максимального размера.
initial_buffer_size = file_size / max_record_size + 1 (/ is integer division)
2) Выделите этот буфер, считайте ваши целые числа в этот буфер, пока он не заполнится.Если весь файл прочитан, то вы закончите, в противном случае измените размер или перераспределите буфер для удовлетворения ваших новых предполагаемых потребностей.
resize_size =
prev_buffer_size
+ bytes_not_read / ( bytes_already_read / number_of_records_already_read )
+ 1
3) Считайте в этот буфер (с того места, где закончилось предыдущее чтение), пока он не заполнитсяили все файлы были прочитаны.
4) Если не закончено, повторите с шага 2) с новым prev_buffer_size
.
Это будет работать лучше, если числа (записи)полностью случайным образом распределены с точки зрения размера байта.Если нет, и если вы знаете, какой у них дистрибутив, вы можете настроить алгоритм в соответствии с этим.