牛骨文教育服务平台(让学习变的简单)
博文笔记

win32读取超过2G大文件的解决办法

创建时间:2014-12-23 投稿人: 浏览次数:169

大文件读取就是最近遇到的一个问题,究其原因由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类型的,这个跟具体的编译器有关了。 

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。