コードは現在これを行っており、fgetpos は 4GB を超えるファイルを処理しますが、シークはエラーを返しますfile > 4GB
。
fpos_t currentpos;
sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");
fgetpos(fp,¤tpos);
m_filesize=currentpos;
「64」が含まれる回答はすべて無視してください。-D_FILE_OFFSET_BITS=64
Linux では、 CFLAGS に追加し、 の代わりに値を取得/返す関数fseeko
およびを使用する必要があります。これらは C の一部ではなく、POSIX です。他の (Linux 以外の) POSIX システムでは、64 ビットであることを確認するために別のオプションが必要になる場合があります。ドキュメントを確認してください。ftello
off_t
long
off_t
Windows を使用している場合は、GetFileSizeEx (MSDN)が必要です。戻り値は 64 ビットの int です。
Linuxの stat64 (マンページ)は正しいです。FILE* を使用している場合は fstat 。
このコードは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
位置が指す型の変数で返されます。
ソースが 32 ビット マシンでコンパイルされている場合、_FILE_OFFSET_BITS == 64
この関数は名前で使用できるfgetpos
ため、透過的に古いインターフェイスを置き換えます。
Stat は常に fseek よりもファイル サイズを判断するのに適しています。ファイルではないものでは安全に失敗します。64 ビットのファイルサイズは操作固有のものです。gcc では、コマンドの最後に「64」を付けるか、デフォルトですべての標準呼び出しを強制的に 64 にすることができます。詳細については、コンパイラのマニュアルを参照してください。
少なくとも Linux では、fseek の代わりに lseek64 を使用できます。