菜鸟:mfc中cfile::read函数怎么会自己判断读入数据类型?
正在学vc++图像处理,遇到心烦的问题:在vc++图像处理书附带的源代码中的cdib类成员函数read()里面调用了CFile的
成员函数read(),msdn上写明read()是将文件数据读入read()第一个参数指向的内存缓冲区。第一次调用我能弄懂,但是第二次调用read(),第一个参数为m_lpBMIH,按照源代码的理解是将信息头数据读入内存,但是read函数怎么知道只从CFile对象中选取信息头这部分内容读入内存。我的理解是read按照第一个参数类型在CFile对象中选取和这个类型匹配的数据类型读入内存,还有一种理解是read函数读入数据后,下一次调用自动从上次读到的数据末尾开始读。
请高人知道小弟!
/*************************************************************************
*
* \函数名称:
* Read()
*
* \输入参数:
* CFile* pFile - 指向CFile对象的指针
*
* \返回值:
* BOOL - 如果成功,则返回TRUE
*
* \说明:
* 该函数DIB从一个文件读入CDib对象。该文件必须成功打开。如果该文件是BMP文件
* 读取工作从文件头开始。如果该文件是一个文档,读取工作则从当前文件指针处开始
*
************************************************************************
*/
BOOL CDib::Read(CFile* pFile)
{
// 释放已经分配的内存
Empty();
// 临时存放信息的变量
int nCount, nSize;
BITMAPFILEHEADER bmfh;
// 进行读操作
try
{
// 读取文件头
nCount = pFile->Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));
if(nCount != sizeof(BITMAPFILEHEADER)) {
throw new CException;
}
// 如果文件类型部位"BM",则返回并进行相应错误处理
if(bmfh.bfType != 0x4d42) {
throw new CException;
}
// 计算信息头加上调色板的大小,并分配相应的内存
nSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
m_lpBMIH = (LPBITMAPINFOHEADER) new char[nSize];
m_nBmihAlloc = m_nImageAlloc = crtAlloc;
// 读取信息头和调色板
nCount = pFile->Read(m_lpBMIH, nSize);
// 计算图象数据大小并设置调色板指针
ComputeMetrics();
// 计算调色板的表项数
ComputePaletteSize(m_lpBMIH->biBitCount);
// 如果DIB中存在调色板,则创建一个Windows调色板
MakePalette();
// 分配图象数据内存,并从文件中读取图象数据
m_lpImage = (LPBYTE) new char[m_dwSizeImage];
nCount = pFile->Read(m_lpImage, m_dwSizeImage);
}
// 错误处理
catch(CException* pe)
{
AfxMessageBox("Read error");
pe->Delete();
return FALSE;
}
// 返回
return TRUE;
}