C++ vector的resize存在的坑
最近在專案中用到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(in.gcount()<50)break;
data.clear();
}
執行之後發現陷入了死迴圈,列印了了readedSize發現值一直保持在50,所以無法跳出迴圈體;經過測試發現在data.clear() 呼叫之後,data.size()的值一直是0;原來vector的clear方法會將內部計數清零,而我以為在呼叫read向vector拷貝資料時會改變內部計數,其實是不會改變,而只是將資料拷貝過去,這裡給出解決方法就是在讀取資料後,呼叫vector的resize方法設定為讀到資料的長度即可。