菜鸟: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;
}
...全文
356 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 默认是按字节去读的,不管你是什么类型,都按字节读。
YOLOv11人物目标检测数据集 目标类别:['Persona'] 文类别:['人物'] 训练集:1683 张 验证集:182 张 测试集:0 张 总计:1865 张 该数据集提供了data.yaml文件,内容如下: train: ../train/images val: ../valid/images test: ../test/images nc: 1 names: ['Persona'] YOLOv11城市街头与室内场景人物目标检测数据集 该数据集涵盖了城市街头、商业街区、办公场所及室内生活等多种场景的人物目标检测,具有广泛的应用价值。通过多样的场景设置和丰富的拍摄角度,能够有效提升模型在复杂环境下的目标识别能力,为智慧城市、安防监控及人机交互等领域提供高质量的训练数据支持。 从数据分布来看,该数据集包含1683张训练集图像、182张验证集图像以及0张测试集图像,整体比例分配合理。训练集与验证集的比例约为9.25:1,能够充分满足模型训练与性能评估的需求,确保模型在不同场景下的泛化能力得到充分验证。 该数据集的标注工作严谨规范,所有图像均经过人工精确标注,每个目标都配有清晰的边界框和统一的标签“Persona”。标注过程遵循严格的标准,确保了数据的高质量和一致性,为后续的模型训练和性能优化提供了可靠的基础。 基于其多样化的场景覆盖和高质量的标注数据,该数据集可广泛应用于智慧城市管理、公共场所安防监控、智能零售分析以及家庭安防等多个领域。特别是在需要精准识别复杂环境人物的目标检测任务,该数据集能够显著提升模型的准确性和鲁棒性。

19,464

社区成员

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

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