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交流一下啊。。