Cでファイルのサイズをどのように決定しますか?

NilObject のコードに基づく:

#include <sys/stat.h>
#include <sys/types.h>

off_t fsize(const char *filename) {
    struct stat st; 

    if (stat(filename, &st) == 0)
        return st.st_size;

    return -1; 
}

変更:

  • ファイル名引数を const char にしました .
  • struct stat を修正しました 定義に変数名がありませんでした。
  • -1 を返します 0 の代わりにエラーが発生した場合 、これは空のファイルではあいまいです。 off_t は符号付きの型であるため、これが可能です。

fsize() が必要な場合 エラー時にメッセージを出力するには、これを使用できます:

#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

off_t fsize(const char *filename) {
    struct stat st;

    if (stat(filename, &st) == 0)
        return st.st_size;

    fprintf(stderr, "Cannot determine size of %s: %s\n",
            filename, strerror(errno));

    return -1;
}

32 ビット システムでは、これをオプション -D_FILE_OFFSET_BITS=64 でコンパイルする必要があります。 、それ以外の場合は off_t 最大 2 GB の値のみを保持します。詳細については、Linux での大きなファイルのサポートの「LFS の使用」セクションを参照してください。


int を使用しないでください .最近では、サイズが 2 ギガバイトを超えるファイルが汚れとして一般的です

unsigned int を使用しないでください .サイズが 4 ギガバイトを超えるファイルは、やや一般的ではない汚れとして一般的です

IIRC 標準ライブラリは off_t を定義しています 符号なしの 64 ビット整数として、誰もが使用する必要があります。 16 エクサバイトのファイルがぶらぶらし始めたら、数年でそれを 128 ビットに再定義できます。

Windows を使用している場合は、GetFileSizeEx を使用する必要があります。実際には符号付き 64 ビット整数を使用するため、8 エクサバイトのファイルで問題が発生し始めます。愚かなマイクロソフト! :-)


Matt のソリューションは、C ではなく C++ であることと、最初の通知が必要ないことを除けば、機能するはずです。

unsigned long fsize(char* file)
{
    FILE * f = fopen(file, "r");
    fseek(f, 0, SEEK_END);
    unsigned long len = (unsigned long)ftell(f);
    fclose(f);
    return len;
}

ブレースも修正しました。;)

更新:これは実際には最善の解決策ではありません。 Windows では 4GB のファイルに制限されており、GetFileSizeEx などのプラットフォーム固有の呼び出しを使用するよりも遅くなる可能性があります。 または stat64 .