size_t или long для размера строки, содержащей файл? - PullRequest
2 голосов
/ 29 сентября 2010

Предположим, я хочу прочитать весь файл в памяти. Я бы открыл его в двоичном режиме, использовал бы fseek, чтобы добраться до конца файла, затем сделал бы ftell, чтобы получить его размер. Тогда я бы выделил строку с тем же размером, что и файл, и просто прочитал ее, верно?

Проблема в том, что ftell возвращает long int, а malloc должен получить аргумент size_t. Теперь, насколько я могу судить, size_t может быть больше, чем long int (я только что проверил C: справочное руководство от Harbison и Steele, и в главе 11 упоминается что size_t может быть определено как unsigned long long, в зависимости от компилятора). Я полагаю, что обратное может быть правдой (и это было бы реальной проблемой, поскольку я бы бросил long long в long, или что-то в этом роде)

Итак, мой вопрос: как мне с этим справиться?

Спасибо!

edit: спасибо, ребята, это было очень быстро! Я буду использовать mmapposix_madvise тоже, что я нашел после информации о mmap)!

Ответы [ 3 ]

3 голосов
/ 29 сентября 2010

Я думаю, что вы хотите использовать mmap () вместо этого.

1 голос
/ 29 сентября 2010

Если ваши файлы достаточно велики для того, чтобы это могло быть проблемой, они также достаточно велики для почти наверняка сбоя выделения памяти.

Либо не беспокойтесь об этом, либо переключитесь на технику отображения памяти, специфичную для ОС.

1 голос
/ 29 сентября 2010

Я думаю, что проблема кастинга спорна. Поскольку меньшее из двух, long, имеет максимум + 2 ^ 31 (если подписано), если вы прочитаете все это сразу, вы будете занимать 2 ГБ памяти. Обычно это плохая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...