Самодельный fstat для получения размера файла, всегда возвращает 0 длины - PullRequest
4 голосов
/ 27 марта 2010

Я пытаюсь использовать свою собственную функцию, чтобы получить размер файла из файла. Я буду использовать это для выделения памяти для структуры данных для хранения информации о файле.

Функция размера файла выглядит следующим образом:

long fileSize(FILE *fp){
    long start;
    fflush(fp);
    rewind(fp);
    start = ftell(fp);
    return (fseek(fp, 0L, SEEK_END) - start);
}

Есть идеи, что я здесь не так делаю?

Ответы [ 3 ]

3 голосов
/ 27 марта 2010

Do

fseek(fp, 0L, SEEK_END);
return (ftell(fp) - start);

вместо

return (fseek(fp, 0L, SEEK_END) - start);

потому что fseek возвращает ноль в случае успеха, а не смещение, как вы ожидаете.

1 голос
/ 27 марта 2010

Несколько комментариев:

  • не вызывайте fflush() - ваш поток может быть потоком чтения, для которого fflush() приводит к неопределенному поведению

  • У вас нет ошибок!

  • fseek() возвращает 0 для успеха - вам нужно позвонить ftell(), чтобы узнать длину

Измените код на это:

long fileSize(FILE *fp)
{    
    fseek(fp, 0L, SEEK_END);
    return ftell(fp);
}
0 голосов
/ 27 марта 2010

Вам нужно позвонить 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);
}

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

...