c++ 处理大文件

最近写一个小工程,要读写大文件,10~20G。

开始经过一番考虑,考虑到c函数的高效与操作难度(以前用c的函数,总忘关文件)。直接使用了C++的ifstream,用类操作比较方便。由于随机读取文件位置,所以需要找办法能读取到任一位置,这在处理小文件时没有问题,但在处理大于4G文件时出现了问题。

以前在linux下,没多考虑什么,c和c++处理大于4G文件都没有问题,现在才知道原来是64位linux系统,默认编64位程序了,所有的操作都在编译时因为特殊的宏而具有了处理大于4G文件的能力。

这回在windows下编译的32位程序,程序中封装ifstream做了一个随机读取类,结果发现大约到3.4G的时候,总也读不过去了。查了一下,发现c++ 标准库中ifstream中的streamoff默认编译的32,于是ifstream::fseek(streampos pos)是无效,然后考虑使用,ifstream::seekg (streamoff off, ios_base::seekdir way),结果发现这个ios_base::seekdir也是只能处理32位的文件长度。

无奈之下,google一次,获得msdn的函数 _fseeki64 , _ftelli64,完美解决问题。

msdn网址http://msdn.microsoft.com/zh-tw/library/vstudio/0ys3hc0b(v=vs.80).aspx , http://msdn.microsoft.com/zh-cn/library/vstudio/75yw9bf3.aspx

然后为了配合c函数,我找了相应c函数来查看文件状态。 


feof(FILE* fp)查看文件是否到结尾,到结尾返回true

ferror(FILE* fp)查文件是否状态异常,文件正常返回0

clearerr(FILE*fp)清空文件各种错误标志位。包括文件结尾标志和文件读取越界等错误。

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ); 读取文件内容,这个函数非常高效。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值