По крайней мере, на 32-битной ОС ftell()
он переполняется или ошибочен или просто запускается в Undefined Behavior.
Чтобы обойти это, вы можете использовать off_t ftello(FILE *stream);
и #define _FILE_OFFSET_BITS 64
.
Verbatim from man ftello
:
Функции fseeko () и ftello () идентичны функциям fseek (3) и ftell (3) (см. fseek (3)), соответственно, за исключением того, что аргумент offset fseeko () и возвращаемое значение ftello () имеет тип off_t вместо long.
На многих архитектурах off_t и long являются 32-битными типами, но компиляция с
#define _FILE_OFFSET_BITS 64
выключит_t в 64-разрядный тип.
Обновление:
Согласно IEEE Std 1003.1, выпуск 2013 года
ftell()
должен возвращать-1
и устанавливатьerrno
наEOVERFLOW
в таких случаях:EOVERFLOW
Для ftell ( ), текущее смещение файла не может быть правильно отображено в объекте типа long.