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交流一下啊。。
直接對CFile的Seek操作,可以反映到關聯的CArchive(而且有兩個)上面麼?