Самодельный fstat для получения размера файла, всегда возвращает 0 длины
Я пытаюсь использовать свою собственную функцию, чтобы получить размер файла из файла. Я буду использовать это для выделения памяти для структуры данных для хранения информации о файле.
Функция размера файла выглядит следующим образом:
long fileSize(FILE *fp){
long start;
fflush(fp);
rewind(fp);
start = ftell(fp);
return (fseek(fp, 0L, SEEK_END) - start);
}
Есть идеи, что я здесь делаю не так?
3 ответа
Делать
fseek(fp, 0L, SEEK_END);
return (ftell(fp) - start);
вместо
return (fseek(fp, 0L, SEEK_END) - start);
потому что fseek возвращает ноль в случае успеха, а не смещение, как вы ожидаете здесь.
Несколько комментариев:
не звони
fflush()
- ваш поток может быть потоком чтения, для которогоfflush()
приводит к неопределенному поведениюу вас нет проверки ошибок!
fseek()
возвращает 0 для успеха - вам нужно позвонитьftell()
чтобы получить длину
Измените код на это:
long fileSize(FILE *fp)
{
fseek(fp, 0L, SEEK_END);
return ftell(fp);
}
Вам нужно позвонить ftell
после fseek
, Пытаться:
long fileSize(FILE *fp){
long start;
fflush(fp);
rewind(fp);
start = ftell(fp);
fseek(fp, 0L, SEEK_END);
return ftell(fp);
}
Там нет необходимости делать разницу, поэтому ваш первый ftell
бесполезен, и вы можете избавиться от него. Я хотел бы использовать:
long filezise(FILE *fp)
{
fseek(fp,OL,SEEK_END);
// fseek(f, 0, SEEK_SET); - only if you want to seek back to the beginning
return ftell(fp);
}
Также убедитесь, что вы открываете свой файл в двоичном режиме.