#cpp
Никак не могу понять почему, если хочу узнать длину файла ~3GB в байтах вот так: FILE * f; errno_t err = fopen_s(&f, "a.iso", "rb"); if (f == NULL) { return 0; } unsigned long int size = filelength(fileno(f)); cout << size << endl; то мне выдаёт максимально возможное число для типа unsigned long int 4 294 967 295. С маленькими файлами всё нормально (правда я там int использую). Функция filelength объявлена в. Подскажите, пожалуйста, что тут неправильно.
Ответы
Ответ 1
Ну, если файл большой :), то для этого есть, например, _filelengthi64 (подробнее тут).Ответ 2
Функция filelength возвращает длину файла в байтах. Возвращаемое значение -1L свидетельствует об ошибке и errno устанавливается в EBADF, чтобы указать на неверный файловый handle. Надо помнить, что возвращаемая переменная имеет тип long. Знаковый long - это до 2 ГБ. Если размер файла больше, то произошло бы переполнение, но функция это обрабатывает и сообщает об ошибке, вернув -1. Да, так и есть если я пишу long int size = filelength(fileno(f)); То возвращает -1L , но я беру unsigned long int а тут макс значение 4 294 967 295, вот оно почему то и выводится хотя файл сам меньше, ~ 3gb Потому что функции всё равно, какому типу ты присваиваешь результат. Она всегда возвращает long, что означает -1 для слишком больших файлов. Когда ты присваиваешь это в unsigned long, ты получаешь беззнаковое число с таким же набором битов. Все единичные биты в знаковом числе означают -1, а в беззнаковом - максимум.
Комментариев нет:
Отправить комментарий