Jin the Conqueror 2015-06-03 10:50 采纳率: 100%
浏览 2480
已采纳

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 2015-06-03 11:26
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏