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类型的,这个跟具体的编译器有关了。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: Hive优化--定位调优指导
- 下一篇: 利用PHP获取网页的源代码或标题