咨询下关于CArchive两段小代码的区别

srxumin 2009-07-14 02:58:49
问题我已经解决了,链接在这里:
http://topic.csdn.net/u/20090712/11/8a2b638a-75d6-425b-b7a7-f57eb1a9c142.html
我现在就想知道原理


    BYTE *buf=new BYTE[1024];
CMemFile file(buf,1024,256);
CArchive ar(&file,CArchive::store);
int i=5;
ar<<i;
ar.Close();
file.Close();

CMemFile f(buf,1024,256);
CArchive ar1(&f,CArchive::load);
int i1;
ar1>>i1;


用这些代码会造成一个错误:
vc6会自动弹出一个错误对话框,而且还会显示中文:试图越过其尾端对一未命名文件进行读写

但是将上面代码改成:

BYTE *buf=new BYTE[1024]; 
CMemFile file(buf,1024,256);
CArchive ar(&file,CArchive::store);
int i=5;
ar <<i;
ar.Close();

file.SeekToBegin();
CArchive ar1(&file,CArchive::load);
int i1;
ar1>>i1;
ar1.Close();


运行就正常了,请问这是为什么?难道序列化读取时不能再新建一个CMemFile再进行操作吗?
...全文
116 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
srxumin 2009-07-14
  • 打赏
  • 举报
回复
那就结贴,谢谢了
快乐鹦鹉 2009-07-14
  • 打赏
  • 举报
回复
从其类定义来看,没有。
srxumin 2009-07-14
  • 打赏
  • 举报
回复
那有没有什么方式使CMemFile打开文件时不会将buf清除?
快乐鹦鹉 2009-07-14
  • 打赏
  • 举报
回复
如果用CFile打开硬盘中的文件,好像就不会清除这个文件的,这是不是CFile和CMemFile的区别之一?
==CFile打开时也可以将文件内容清除。这个可以根据打开方式决定。
srxumin 2009-07-14
  • 打赏
  • 举报
回复
各位大侠解释的都有理,让小弟受益匪浅
我总结了下你们的回答,大概就是说用CMemFile每次打开一个Buf,它自动就会清除这片buf是吧?
如果用CFile打开硬盘中的文件,好像就不会清除这个文件的,这是不是CFile和CMemFile的区别之一?
Ghost90 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 happyparrot 的回复:]
CMemFile::CMemFile

CMemFile( UINT nGrowBytes = 1024 );
CMemFile( BYTE* lpBuffer,UINT nBufferSize,UINT nGrowBytes = 0 );
说明:
首次加载将打开一个空的内存文件。值得注意的是该文件由构造函数打开,不应调用CFile::Open函数。
===你再次CMemFile f(buf,1024,256)时,其实是将buf中的内容清空了。此时使用ar>>i1;可想而知其后果。。。。。。
[/Quote]

版猪的是深一层的含义,这个问题也要注意

要不出错的话也可以这么改,但运行结果就不一样


BYTE *buf=new BYTE[1024];
CMemFile file(buf,1024,256);
CArchive ar(&file,CArchive::store);
i=5;
ar<<i;
ar.Close();
file.Close();

CMemFile f(buf,1024,256);
f.Write("abcde",6);
f.SeekToBegin();
CArchive ar1(&f,CArchive::load);
int i1;
ar1>>i1;
Ghost90 2009-07-14
  • 打赏
  • 举报
回复

BYTE *buf=new BYTE[1024];
CMemFile file(buf,1024,256);
CArchive ar(&file,CArchive::store);
int i=5;
ar<<i;
ar.Close();
file.Close();

CMemFile f(buf,1024,256); //f刚被定义是一个空的 内存空间
CArchive ar1(&f,CArchive::load); // 加载一块空的文件内存块就报你说的信息了

int i1;
ar1>>i1;



BYTE *buf=new BYTE[1024];
CMemFile file(buf,1024,256);
CArchive ar(&file,CArchive::store);
int i=5;
ar <<i;
ar.Close();

file.SeekToBegin(); //这个文件内存已经写入信息了,又把指针移到内存的开始处,能读出信息
CArchive ar1(&file,CArchive::load);
int i1;
ar1>>i1;
ar1.Close();

supconsupcon 2009-07-14
  • 打赏
  • 举报
回复
两段代码的的文件对象一个是f,一个是file???
快乐鹦鹉 2009-07-14
  • 打赏
  • 举报
回复
CMemFile::CMemFile

CMemFile( UINT nGrowBytes = 1024 );
CMemFile( BYTE* lpBuffer,UINT nBufferSize,UINT nGrowBytes = 0 );
说明:
首次加载将打开一个空的内存文件。值得注意的是该文件由构造函数打开,不应调用CFile::Open函数。
===你再次CMemFile f(buf,1024,256)时,其实是将buf中的内容清空了。此时使用ar>>i1;可想而知其后果。。。。。。
liaoy747 2009-07-14
  • 打赏
  • 举报
回复
根据你的代码,第一段代码写入文件之后,文件的当前位置应该是指向文件末尾,此时再对同一个文件进行读取,就会读到文件结束符,当然会提示穿越文件尾端了.
修正后的代码是将文件指针SeekToBegin之后进行读取的,所以能从第一个字节开始读取,然后文件中的指针移动.楼主可以把SeekToBegin注释掉,如果同样出错,证明我分析对了.
纯理论分析,不对勿怪.

16,551

社区成员

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

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

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