Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Длина большого файла через функцию filelength

#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, а в беззнаковом - максимум.

Комментариев нет:

Отправить комментарий