用内存映射文件方法把整个文件映射到内存后却只能读出文件中的前面一部分数据,大虾请进!!!

wmg8082 2007-03-20 09:04:16
请问这种情况是正常的吗,如何解决???偶是菜鸟,分数不够,请见谅!!
文件映射例程如下,其它例程中用lpData或加上偏移读数据的不同部分,结果缺只能读出其中前面一部分数据,实在难解,跪求大虾指点:
bool LDHandle::OpenLDHandle (const std::string filename)
{
m_hFile=CreateFile(filename.c_str (),GENERIC_READ,FILE_SHARE_READ,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(m_hFile==INVALID_HANDLE_VALUE)
{
throw exception("do not open Ld2 file");
}
m_hFileMap=CreateFileMapping(m_hFile,NULL,PAGE_READONLY,0,0,NULL);
if(m_hFileMap==INVALID_HANDLE_VALUE)
{
CloseHandle(m_hFile);
throw exception("file maping error");
}
//映射到整个文件
lpMemory=(BYTE*)MapViewOfFile(m_hFileMap,FILE_MAP_READ,0,0,0);
if(lpMemory==NULL)
{
CloseHandle(m_hFileMap);
CloseHandle(m_hFile);
throw exception("MapViewOfFile error");
}
//lpData指向数据区,LDHEADER是文件头结构
lpData=reinterpret_cast<WORD*>(lpMemory+sizeof(LDHEADER));

return true;
}
...全文
255 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wmg8082 2007-03-20
  • 打赏
  • 举报
回复
是偏移算错了
wmg8082 2007-03-20
  • 打赏
  • 举报
回复
问题解决了,谢谢chehw及WinForce
wmg8082 2007-03-20
  • 打赏
  • 举报
回复
4.1M,还可打开另一个8M大同样格式的文件,出现同样的问题
chehw 2007-03-20
  • 打赏
  • 举报
回复
程序中偏移量的计算是否正确?
由于的lpData类型设为了word *,直接加1个单位的偏移量相当于增加了2个字节,因而偏移量最大不能超过(dwFileSize/2)。
WingForce 2007-03-20
  • 打赏
  • 举报
回复
文件多大?

wmg8082 2007-03-20
  • 打赏
  • 举报
回复
读到约一半多就出现"Unknown exception",若没设定异常则出现运行时错误,具体位置还没去测试,但若不用内存映射文件方法则能正常全部读到,谢谢
chehw 2007-03-20
  • 打赏
  • 举报
回复
读到哪出问题了?怎么读的?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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