8

コードは現在これを行っており、fgetpos は 4GB を超えるファイルを処理しますが、シークはエラーを返しますfile > 4GB

fpos_t currentpos;

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

fgetpos(fp,&currentpos);
m_filesize=currentpos;
4

6 に答える 6

9

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

于 2010-08-03T18:16:54.050 に答える
6

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

Linuxの stat64 (マンページ)は正しいです。FILE* を使用している場合は fstat 。

于 2008-09-22T03:41:09.510 に答える
3

このコードは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;
}
于 2008-09-22T02:52:46.257 に答える
2

(glibc マニュアルから盗用)

int fgetpos64 (FILE *stream, fpos64_t *position)

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

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

于 2008-09-22T02:42:44.407 に答える
2

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

于 2008-09-22T02:48:14.863 に答える
1

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

于 2008-09-22T02:40:33.150 に答える