最近在项目中用到vector,用于发送文件数据到远端,由于文件很大所以不能一次读取发送,因此采用每次读取n个字节的数据到vector
代码类似是这样的:
ifstream in;
in.open(“file”,ios::in|ios::binary);
in.seekg(0,in.end);
uint32 totalSize = in.tellg();
in.seekg(0,in.beg);
uint32 readedSize = 0;
vector<uint8> data;
data.resize(50);
while(1){
in.read(reinterpret_cast<char*>(data.data()), 50);
TransferToRemote(data);
if(data.size()<50)break;
data.clear();
}
运行之后发现陷入了死循环,打印了了readedSize发现值一直保持在50,所以无法跳出循环体;经过测试发现在data.clear() 调用之后,data.size()的值一直是0;原来vector的clear方法会将内部计数清零,而我以为在调用read向vector拷贝数据时会改变内部计数,其实是不会改变,而只是将数据拷贝过去,这里给出解决方法就是在读取数据后,调用vector的resize方法设置为读到数据的长度即可。