为什么第一次循环正常,到第二次的时候就出错了?

部分代码:
class ChunkInfo{
public:
char *buffer_address;//内存块的地址
long realsize;//内存块的大小
ChunkInfo(){}
ChunkInfo(char *buffer,long size)
{
this->realsize = size;
this->buffer_address = buffer;
}
};
list<ChunkInfo> CHUNK_INFO_LIST;
ifstream in;
in.open(inpath.c_str(),ios::in|ios::binary|ios::ate);
ifstream::pos_type size = in.tellg();
in.seekg(0,ios::beg);//指针回到头部

//如果文件大小大于1.5GB就分块读取,每块设置大小1.5GB,并把信息构造在ChunkInfo中,然后保存在list里。

if(size>MAX_SIZE_BIT)
{
cout<<"A"<<endl;
while(in.good())
{
cout<<in.tellg()<<endl;
//第一次循环正常,到第二次的时候就在这出错了

char *chunk_buffer = new char[CHUNK];
in.read(chunk_buffer,CHUNK);
long real_size = (long)in.gcount();
ChunkInfo chunk(chunk_buffer,real_size);
CHUNK_INFO_LIST.push_back(chunk);

}
in.close();
}

长风秋雁
浏览 123回答 2
2回答

Qyouu

C++自己的流API似乎不支持,必须使用操作系统提供的api如果是windows,应该使用file mapping相关的api,看CreateFileMapping之类函数的MSDN说明吧即使不大于2G在绝大部分情况下,大于1.5G放内存都是不可能的。缺省C++api使用的是堆,而堆的内存块是很小的。分配给用户端的内存总共才2G,其中很多还要分配给系统和代码。如果逆要使用超过几百M的内存,就需要好好研究虚拟内存系统,不能直接指望C++API了

POPMUISE

大文件可以被一部分一部分地读,这在windows里被以虚拟内存映射文件的方式实现。而不能用其本身的文件流,因为它自己是调用系统API实现的,而又缺少参数,便保险地映射全部文件到内存,而一般系统的虚拟地址空间为用户2G,服务器上才3G。而2G里显然要包括程序文件本身与环境子系统DLL们。所以剩下不足2G了,这下就不够用了,所以不能用C++里的文件流。用windows系统自带的API函数可以实现分块映射读取,当然读完一块要释放掉,不然最后还是不够用,这样就行了,你可以看书去了。
打开App,查看更多内容
随时随地看视频慕课网APP