質問
現在コードはこれを実行しており、fgetposは4GBを超えるファイルを処理しますが、シークはエラーを返すため、ファイルの最後までシークする方法はわかりません。 file > 4GB
?
fpos_t currentpos;
sok=fseek(fp,0,SEEK_END);
assert(sok==0,"Seek error!");
fgetpos(fp,¤tpos);
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 を使用できます。