c++std::ifstream読み取りファイルが不完全ですか?iosを忘れたのかなbase::binary
1443 ワード
時間を無駄にしてまたあなたを苦しめている小さな問題です.
画像を読み取るには20000バイトを読み取るべきだったのに、なぜ300バイトしか読み取らなかったのですか?元は少なくなったios_base::binary!!!
文字列以外のテキストを読み込む場合はios_を付ける必要があります.base::binary、そうしないと0に遭遇してEOFに戻る可能性があります.
次は私が問題を起こしたコードに直接行きます.もちろん今は正しいです.
画像を読み取るには20000バイトを読み取るべきだったのに、なぜ300バイトしか読み取らなかったのですか?元は少なくなったios_base::binary!!!
文字列以外のテキストを読み込む場合はios_を付ける必要があります.base::binary、そうしないと0に遭遇してEOFに戻る可能性があります.
次は私が問題を起こしたコードに直接行きます.もちろん今は正しいです.
//
boost::shared_ptr _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(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);
}