自制的fstat获取文件大小,总是返回0长度

时间:2010-03-27 08:26:46

标签: c file file-io binary fseek

我正在尝试使用自己的函数从文件中获取文件大小。我将使用它为数据结构分配内存以保存文件中的信息。

文件大小功能如下所示:

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

我在这里做错了什么想法?

3 个答案:

答案 0 :(得分:3)

待办事项

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

而不是

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

因为fseek在成功时返回零而不是您在此期望的偏移量。

答案 1 :(得分:1)

一些评论:

  • 不要致电fflush() - 您的信息流可能是一个读取流,fflush()会导致未定义的行为

  • 您没有任何错误检查!

  • fseek()返回0表示成功 - 您需要致电ftell()以获取长度

将代码更改为:

long fileSize(FILE *fp)
{    
    fseek(fp, 0L, SEEK_END);
    return ftell(fp);
}

答案 2 :(得分: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);
}

另外,请确保以二进制模式打开文件。