VC++中,用CFile类,BMP位图打开使用Read和Write函数的问题

创建了一个CDib类,继承于CObject。想在其中编写两个各成员函数 void CDib::LoadFile(const char*dibFileName); void CDib::SaveFile(const char *filename); 分别在两个函数中,调用CFile对象的Read,和Write函数进行位图打开和存储。 其中: 在CDib头文件中,有几个关键的变量定义: RGBQUAD*m_pRGB; // 理论上的颜色表首地址,至于有无颜色表它不做判断 BYTE *m_pData,*m_pData2; //m_pData,存储是位图的数据信息,很关键。 BITMAPFILEHEADER bitmapFileHeader; //文件信息头结构,其地址是文件的开头地址 BYTE *pDib; //位图数据信息的首地址,紧跟bitmapFileHeader地址的末尾 几个函数的实现在源文件里 void CDib::LoadFile(const char*dibFileName) {strcpy(m_fileName,dibFileName); CFile dibFile(m_fileName,CFile::modeRead); dibFile.Read((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));//把m_filename中前面的文件头信息读到以&bitmapFileHeader开始的连续地址里。 DWORD fileLength=dibFile.GetLength(); //求得整个文件的字节数 DWORD size=fileLength-sizeof(BITMAPFILEHEADER); //BMP文件除了文件头信息,剩余字节数 BYTE*pDib=(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,size);//开辟一段存储空间 dibFile.Read((void*)pDib,size); //把m_filename下的文件从文件头之后的内容放到pDib为首的地址空间里。 dibFile.Close(); //理论上到这里已经把 m_filename所指的bmp文件内容全部拷到了临时开辟的以&bitmapFileHeader为首地址的,字节数为fileLength长度的空间里了。 m_pBitmapInfo=(BITMAPINFO*) pDib; //进行一些指针的记录。 m_pBitmapInfoHeader=(BITMAPINFOHEADER*)pDib; m_pRGB=(RGBQUAD*)(pDib+m_pBitmapInfoHeader->biSize); //理论上颜色表首地址,如果是24位色则是像素数据首地址,因为24位色没有颜色表 colorTableSize=0; // 我打开的是24位色彩的,所以颜色表长度为0 m_pData=pDib+m_pBitmapInfoHeader->biSize+colorTableSize; //m_pData存的是图像像素数据首地址,因为跨过了信息头以及颜色表 } void CDib::SaveFile(const char * filename) //存放的目标路径 {CFile dibFile(filename,CFile::modeWrite|CFile::modeCreate); //把目标路径指针,以及读写方式赋给CFile对象 dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER)); dibFile.WriteHuge(pDib,fileLength-sizeof(BITMAPFILEHEADER)); //由于bitmapFileHeader是在CDib里定义的全局变量,&bitmapFileHeader放置的是刚才临时开辟的存储空间的首地址,里面放的是已经打开的位图的所有字节,所以现在将,&bitmapFileHeader开始,fileLength长度字节的内容考到目标路径下去,即filename dibFile.Close(); } 问题:1.我现在在一个按钮的消息函数里,使用语句 this->LoadFile("F:\\tu_1.bmp"); this->SaveFile("F:\\tu_2.bmp"); 编译连接都没问题,但是我在运行程序是,当我点击按钮时,也就是进行图片打开和保存时,弹出错误对话框 Debug assertion failed。 然后在SaveFile的实现里分别设置两个断点 1. dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER)); 2.dibFile.WriteHuge(pDib,fileLength-sizeof(BITMAPFILEHEADER)); 发现程序运行到了1,但是2却没运行。 pDib指针存的是临时开辟的空间里,位图数据信息的首地址,为什么这里会出错呢

第1个回答  2019-08-01
你好!
void
CDib::SaveFile(const
char
*
filename)
//存放的目标路径
{CFile
dibFile(filename,CFile::modeWrite|CFile::modeCreate);
dibFile.Write((void*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER));
dibFile.WriteHuge(pDib,fileLength-sizeof(BITMAPFILEHEADER));
//这里的fileLength在那里初始化的?
dibFile.Close();
}
如果对你有帮助,望采纳。
第2个回答  2019-11-26
不懂你
这个程序为什么会编译通过
因为
fileLength
不是
全局变量
,而是一个在LoadFile函数里定义的
局部变量
,这个函数结束,这个变量就被销毁了;那么在SaveFile函数里,这个变量根本不能被识别,请
告诉我为什么
会编译成功。。。
相似回答