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

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

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

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

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

4 голоса | спросил Fred 27 MaramSat, 27 Mar 2010 11:26:45 +03002010-03-27T11:26:45+03:0011 2010, 11:26:45

3 ответа


0

Do

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

вместо

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

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

ответил codaddict 27 MaramSat, 27 Mar 2010 11:31:07 +03002010-03-27T11:31:07+03:0011 2010, 11:31:07
0

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

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

  • у вас нет проверки ошибок!

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

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

long fileSize(FILE *fp)
{    
    fseek(fp, 0L, SEEK_END);
    return ftell(fp);
}
ответил Paul R 27 MaramSat, 27 Mar 2010 11:40:03 +03002010-03-27T11:40:03+03:0011 2010, 11:40:03
0

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

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

ответил IVlad 27 MaramSat, 27 Mar 2010 11:40:55 +03002010-03-27T11:40:55+03:0011 2010, 11:40:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132