2 neverpassaway neverpassaway 于 2015.06.03 18:50 提问

CArchive的文件指针位置和CFile的文件指针位置是一样的么?
 void Add::OnClickedIdbAdd()
{
    // TODO: Add your control notification handler code here
    UpdateData();
    if (!m_aComp || !m_aEng || !m_aMath || !m_aGym || m_aName=="" || m_aSno=="" || m_aMajor=="" ){
        MessageBox(_T("请完善信息后再确认输入!"), _T("错误"));
        return;
    }

    if (m_aSno.GetLength() != 6){
        MessageBox(_T("学号必须为6位数,请重新输入。"), _T("错误"));
        m_aSno = "";
        UpdateData(FALSE);
        return;
    }

    CFile cf;
    if (!cf.Open(_T("D:\\SIMS.txt"), 
        CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite)){
#if def_DEBUG
        afxDump << "unable to open file" << "\n";
        exit(1);
#endif 
    }
    CArchive cas(&cf, CArchive::store);
    CArchive cal(&cf, CArchive::load);


    CString strSno;
    CString strtemp;


    while (cf.GetPosition() != cf.GetLength()){

        cal >> strSno;
        if (cf.GetPosition() == cf.GetLength()){
            strtemp.Format(_T("等于:pos:%lu,len:%lu"), cf.GetPosition(), cf.GetLength());
            MessageBox(strtemp);
        }
        MessageBox(strSno);
        if (m_aSno == strSno){
            MessageBox(_T("该学号已存在,请重新输入。"), _T("错误"));
            m_aSno = "";
            UpdateData(FALSE);
            return;
        }
    }


    cf.SeekToEnd(); 

    cas << m_aSno << m_aName << m_aMajor << m_aComp
        << m_aMath << m_aEng << m_aGym ;
  strtemp.Format(_T("\r\n"));
    cas << strtemp;                                   //想利用这种方法来输入回车
    cas.Flush();    

    cf.SeekToBegin();
    cal >> m_aSno;
    cal >> m_aName;
    MessageBox(m_aSno);
    MessageBox(m_aName);              //到文件头再重新把刚刚输入的读出来验证一下

    m_aSno = "";
    m_aName = "";
    m_aMajor = "";
    m_aComp = 0;
    m_aEng = 0;
    m_aGym = 0;
    m_aMath = 0;
    UpdateData(FALSE);

    MessageBox(_T("添加成功"), _T("成功"));

    cal.Close();
    cas.Close();
    cf.Close();


}

代码就是这样,现在的问题就是,那个getposition()!=getlength()的循环那里,我是想用这句来判断是否到了文件结尾的。但是不管之前写入了多少数据,这里总是只执行一次就结束了。我这里用的是CFile的getposition和getlength,它和CArchive对象操作的文件指针是一个指针么?还是这样并不能获得CArchive在文件内读写时的指针呢?如果是一个指针,为什么只能循环一次呢?
还有就是hi,上面我在最后又写入了\r\n,因为我看到msdn里面写CArchive的readstring遇到回车就停止了,这样我就能实现先读一行,循环第二次再读第二行,然后继续下去了。但是现在每次都是在最后的时候会出问题,就是第一次读入和显示到视类窗口都是没问题的,第二次读入不会弹出错误,但是在视类窗口显示就不对了,第三次读入到最后CArchive对象close的时候,就会弹出下面这个。求各位大神帮忙啊啊啊啊,这几天都在弄这个破问题一直找不到解决方法,感觉要疯了啊啊啊啊。跪谢啊啊啊啊
图片说明
然后这是视类窗口显示的前三次的内容QAQ
图片说明
有没有哪位大神愿意留下qq交流一下啊。。

2个回答

nswcfd
nswcfd   2015.06.03 19:26
已采纳

直接对CFile的Seek操作,可以反映到关联的CArchive(而且有两个)上面么?

nswcfd
nswcfd 回复Jin the Conqueror: 你的解释很有道理,可以用连续的 >> 和 GetPosition 来验证一下,手头环境不是MFC,没法做实验,抱歉。
2 年多之前 回复
neverpassaway
neverpassaway ”CArchive对象中进行读取操作的时候,CFile中的指针也会移动,但是这个移动不是一一映射的,例如:在CArchive中读30字节,CFile中的指针可能移到4k字节了。(猜测可能是CArchive自己从文件中读满自己的缓冲区,这样就不用频繁的和CFile交互,提高效率)。“这是我刚刚翻到的,所以果然是不能。。还是谢谢你了。我好像找到了新方法
2 年多之前 回复
neverpassaway
neverpassaway 如果不能,我该用什么方法来实现我要的这些功能呢。。。
2 年多之前 回复
neverpassaway
neverpassaway 对啊。。我就是想问这个问题呀。。我感觉我的这个指针的值怪怪的,所以才来问的。。所以能不能呢。。求解答。。
2 年多之前 回复
neverpassaway
neverpassaway   2015.06.03 19:07

刚刚又发现了一个问题,就是我的GetLength不管在哪都是0。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!