質問

現在コードはこれを実行しており、fgetposは4GBを超えるファイルを処理しますが、シークはエラーを返すため、ファイルの最後までシークする方法はわかりません。 file > 4GB?

fpos_t currentpos;

sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");

fgetpos(fp,&currentpos);
m_filesize=currentpos;
役に立ちましたか?

解決

Windows を使用している場合は、 GetFileSizeEx (MSDN). 。戻り値は 64 ビット int です。

Linux の場合 stat64 (マンページ) 正しい。FILE* を操作している場合は fstat。

他のヒント

「64」が含まれる回答はすべて無視してください。Linux では、次のように追加する必要があります -D_FILE_OFFSET_BITS=64 CFLAGS に追加し、 fseeko そして ftello 受け取る/返す関数 off_t の代わりの値 long. 。これらは C の一部ではなく POSIX です。他の (Linux 以外の) POSIX システムでは、次のことを保証するために別のオプションが必要になる場合があります。 off_t 64 ビットです。ドキュメントを確認してください。

このコードは Linux で動作します。

int64_t bigFileSize(const char *path)
{
    struct stat64 S;

    if(-1 == stat64(path, &S))
    {
        printf("Error!\r\n");
        return -1;
    }

    return S.st_size;
}

(glibc マニュアルから抜粋)

int fgetpos64 (FILE *stream, fpos64_t *position)

この関数は fgetpos に似ていますが、ファイルの位置は次の型の変数で返されます。 fpos64_t どの位置を指すのか。

ソースが次のようにコンパイルされている場合 _FILE_OFFSET_BITS == 64 32 ビット マシンでは、この関数は次の名前で利用できます。 fgetpos したがって、古いインターフェースが透過的に置き換えられます。

ファイル サイズを判断するには、fseek よりも stat の方が常に優れており、ファイルではないものについては安全に失敗します。64 ビットのファイルサイズは動作固有のもので、gcc ではコマンドの末尾に「64」を付けることも、デフォルトですべての標準呼び出しを 64 にするように強制することもできます。詳細については、コンパイラのマニュアルを参照してください。

少なくとも Linux では、fseek の代わりに lseek64 を使用できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top