【问题标题】:Homemade fstat to get file size, always returns 0 length自制 fstat 获取文件大小,总是返回 0 长度
【发布时间】:2011-02-01 11:41:17
【问题描述】:

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

文件大小函数如下所示:

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

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

【问题讨论】:

    标签: c file file-io binary fseek


    【解决方案1】:

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

    而不是

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

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

    【讨论】:

    • 谢谢。 *我想我应该花更多时间阅读手册页。 :)
    【解决方案2】:

    几个cmets:

    • 不要调用fflush() - 您的流可能是读取流,fflush() 会导致未定义的行为

    • 您没有任何错误检查!

    • fseek() 成功返回 0 - 您需要调用 ftell() 来获取长度

    把代码改成这样:

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

    【讨论】:

    • 好的建议,我会带走的。谢谢。
    【解决方案3】:

    您需要在fseek 之后调用ftell。试试:

    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);
    }
    

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

    【讨论】:

    • 太好了,我不知道你能做到这一点。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多