win32讀取超過2G大檔案的解決辦法
阿新 • • 發佈:2019-01-28
大檔案讀取就是最近遇到的一個問題,究其原因由2個函式導致。
int fseek(
FILE *stream,
long offset,
int origin
); //設定檔案指標的型別是long
long ftell(
FILE *stream
); //讀取檔案指標的返回值也是long
由於專案是在vc6.0上,所以沒有辦法使用新的API,否則可以用ftelli64和fseeki64來代替ftell和fseek。
__int64 _ftelli64( FILE *stream );
int _fseeki64( FILE *stream, __int64 offset, int origin );
最後是使用fsetpos和fgetpos來解決的:
int fsetpos( FILE *stream, const fpos_t *pos );//將檔案指標定位在pos指定位置
int fgetpos( FILE *stream, fpos_t *pos );//獲取當前檔案讀取指標的位置這其中也遇到了一個問題就是fpos_t的型別,標頭檔案上的定義是這樣的
#if defined (_POSIX_) typedef long fpos_t; #else #if !__STDC__ && _INTEGRAL_MAX_BITS >= 64 typedef __int64 fpos_t; #define _FPOSOFF(fp) ((long)(fp)) #else typedef struct fpos_t { unsigned int lopart; int hipart; } fpos_t; #define _FPOSOFF(fp) ((long)(fp).lopart) #endif #endif
原以為程式中使用的是結構體的定義,結果除錯以後才發現是__int64型別的,這個跟具體的編譯器有關了。