菜鸟:mfc中cfile::read函数怎么会自己判断读入数据类型?

yangshanzi 2010-05-27 04:37:44
正在学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;
}
...全文
298 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yangshanzi 的回复:]
我就是想问问:read第二次读的时候为什么不从文件头开始读,而是从信息头开始读?
[/Quote]
每执行一次读操作文件指针自动后移
yangshanzi 2010-05-27
  • 打赏
  • 举报
回复
我就是想问问:read第二次读的时候为什么不从文件头开始读,而是从信息头开始读?
向立天 2010-05-27
  • 打赏
  • 举报
回复
你要明白一点
不管什么数据类型
它的最小单位都是BYTE
zhou1xp 2010-05-27
  • 打赏
  • 举报
回复
这个要靠你自己写程序了
beyond071 2010-05-27
  • 打赏
  • 举报
回复
是后者,C/C++中的文件操作都是顺序读取或者顺序写入的。
实现的时候内部有指针专门维护的。
shenyi0106 2010-05-27
  • 打赏
  • 举报
回复
CFile 默认是按字节去读的,不管你是什么类型,都按字节读。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧