В чем проблема?
Проблема в том, что fseek()
/ ftell()
- принципиально несостоятельный способ получить размер файла.
Файлы могут быть открыты в двоичном или текстовом режиме.
Для бинарных файлов fseek(file, 0, SEEK_END)
- это явно неопределенное поведение. В соответствии с сноской 268 стандарта C :
Установка индикатора положения файла в конец файла, как и в fseek(file, 0, SEEK_END)
, имеет неопределенное поведение для двоичного потока (из-за возможных завершающих нулевых символов) или для любого потока с кодированием, зависящим от состояния, которое не гарантированно заканчивается в начальном состоянии смены.
За 7.21.9.2 Функция fseek , параграф 3 :
... Бинарный поток не обязательно должен поддерживать вызовы fseek со значением откуда SEEK_END.
Так что не существует переносимого, совместимого со стандартами способа поиска конца двоичного потока.
И вы не можете использовать ftell()
, чтобы получить размер файла, открытого в текстовом режиме. Для 7.21.9.4 Функция ftell , пункт 2 (обратите внимание на выделенные части):
Функция ftell
получает текущее значение индикатора положения файла для потока, на который указывает stream
. Для двоичного потока значение представляет собой количество символов в начале файла. Для текстового потока его индикатор положения файла содержит неопределенную информацию , используемую функцией fseek для возврата индикатора положения файла для потока на его позицию во время вызова ftell; разница между двумя такими возвращаемыми значениями не обязательно является значимым показателем количества написанных или прочитанных символов.
Вы не можете искать конец двоичного потока, и вы не можете использовать ftell
, чтобы получить размер текстового потока.