Самодельный 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);
}

Также убедитесь, что вы открываете свой файл в двоичном режиме.

Другие вопросы по тегам