c++ std::ifstream 讀取檔案不完整? 是不是忘記了ios_base::binary
阿新 • • 發佈:2019-02-01
一次浪費時間又把你折磨的無以復加的小問題。
讀取圖片本應該讀取20000位元組的,為何只讀取了300位元組?原來少了ios_base::binary!!!
如果讀取的非字串形式的文字,注意應該要加上ios_base::binary,否則可能遇到0就提前返回了EOF。
下面直接上我出過問題的程式碼,當然現在是正確的...
//傳送圖片的圖片資料緩衝區
boost::shared_ptr<char> _img_buffer;
unsigned int _img_buffer_size;
{ #define IMG_RES "../Debug/767011.jpg" using namespace std; std::ifstream* tmpImg = new std::ifstream(IMG_RES, ios_base::in | ios_base::_Nocreate | ios_base::binary); if(tmpImg == NULL || !tmpImg->is_open()){ ASSERT_THROW; } tmpImg->seekg(0, ios::end); _img_buffer_size = (int)tmpImg->tellg(); if(_img_buffer_size == -1){ ASSERT_THROW; } if(_img_buffer != NULL){ ASSERT_THROW; } _img_buffer = boost::shared_ptr<char>(new char[_img_buffer_size], [](char* p){delete [] p; p=NULL;}); if(_img_buffer == NULL){ ASSERT_THROW; } memset(_img_buffer.get(), 0, _img_buffer_size); tmpImg->seekg(0, ios::beg); unsigned int tmpCount = 0; do { std::istream& tmpIs = tmpImg->read(_img_buffer.get()+tmpCount, _img_buffer_size-tmpCount); if(tmpIs.eof()){ break; } if(tmpIs.rdstate() != std::ios_base::goodbit){ ASSERT_THROW; } tmpCount += (unsigned int)tmpIs.gcount(); } while (tmpCount < _img_buffer_size); tmpImg->close(); SAFE_DELETE(tmpImg); }