1. 程式人生 > >win32讀取超過2G大檔案的解決辦法

win32讀取超過2G大檔案的解決辦法

大檔案讀取就是最近遇到的一個問題,究其原因由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型別的,這個跟具體的編譯器有關了。