4

ファイルからファイルサイズを取得するために独自の関数を使用しようとしています。これを使用して、ファイルに関する情報を保持するためのデータ構造にメモリを割り当てます。

ファイルサイズ関数は次のようになります。

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

ここで私が間違っていることはありますか?

4

3 に答える 3

3

行う

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

それ以外の

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

fseekは、ここで期待しているオフセットではなく、成功時にゼロを返すためです。

于 2010-03-27T08:31:07.730 に答える
1

いくつかのコメント:

  • 呼び出さないfflush()でください - ストリームが読み取りストリームである可能性がありfflush()、未定義の動作が発生する可能性があります

  • エラーチェックはありません!

  • fseek()成功の場合は 0 を返します -ftell()長さを取得するには呼び出す必要があります

コードを次のように変更します。

long fileSize(FILE *fp)
{    
    fseek(fp, 0L, SEEK_END);
    return ftell(fp);
}
于 2010-03-27T08:40:03.217 に答える
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);
}

また、必ずファイルをバイナリ モードで開いてください。

于 2010-03-27T08:40:55.133 に答える