• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            xbgs

            C++博客 首頁 新隨筆 聯系 聚合 管理
              7 Posts :: 0 Stories :: 13 Comments :: 0 Trackbacks

            下面是我在編程中運用CTypedPtrMap指針模板類的方法,其存儲結構占用物理空間小,比單純的用數組結構存儲的文件將小很多,所以是一種非常推薦的存儲及讀取文件的方法。

            你必須在stdafx.h文件中 包含? #include <afxtempl.h>??? // MFC templates
            在頭文件中包含? #include <io.h>

            其中 CBank.h文件如下:

            class CBank : public CObject? 
            {
            DECLARE_SERIAL(CBank)?? //聲明序列化存儲
            public:
            ??? ?? CBank();
            ?????? CBank(CString str){ m_bankname = str; }
            ?????? CBank(const CBank &b){ m_bankname= b.m_bankname;} //拷貝構造函數
            ????? ? virtual ~CBank();
            private:
            ?????? CString? m_bankname;
            public:
            ??? virtual void Serialize(CArchive& ar);
            };

            typedef CTypedPtrMap<CMapStringToOb,

            ???????????????????? CString,

            ???????????????????? CBank*>CBanktmp;? //這個才是我們根據此類生成的類型

            它的實現文件.cpp如下:

            IMPLEMENT_SERIAL(CBank, CObject, 1)?? //實現序列化存儲
            CBank::CBank()
            {
            ? ? m_bankname="";
            }
            CBank::~CBank()
            {

            }
            void CBank::Serialize(CArchive& ar)
            {
            ??? if (ar.IsLoading())
            ??? {
            ??????? ar >> m_bankname;
            ??? }
            ??? else
            ??? {
            ??????? ar << m_bankname;
            ??? }
            }

            /*----------------------------------------------------
            從文件中讀取參數:
            注意: 其中的m_map是這樣定義的:CBanktmp? m_map;
            -------------------------------------------------*/

            void CDlgBankIn::LoadBankName()
            {
            ?????? UINT? nFlags = CFile::typeBinary |CFile::modeReadWrite;
            ?????? if(_access(_T("BankName.dat"),0))
            ?????? {
            ????????????? nFlags |= CFile::modeCreate;
            ?????? }
            ?????? CFile file;
            ?????? CFileException fe;
            ?????? if (file.Open(_T("BankName.dat"),nFlags, &fe))
            ?????? {
            ?????????? if(file.GetLength()==0)?? //如果文件為空則不進行讀取操作
            ???? ????? {
            ?????????? }
            ?????????? else
            ?????????? {
            ??????????????? CArchive ar(&file, CArchive::load);
            ??????????????? m_map.Serialize(ar);?? //讀取文件
            ?????????????? //根據文件內容填充列表框
            ???? ?????????? POSITION?? pos;
            ??????????????? CString??? strKey;
            ??????????????? CBank?? *pB=NULL;
            ??????????????? for( pos = m_map.GetStartPosition(); pos != NULL; )
            ??????????????? {
            ??????????????????? m_map.GetNextAssoc(pos,strKey,(CBank*)pB);
            ??????????????????? m_CmbBank.AddString(strKey);
            ??????????????? }
            ??????????????? delete? pB;
            ????????????? }
            ?????? }
            ?????? file.Close();
            }

            /*-------------------------------------------------
            功能: 先打開文件,然后查找文件中是否有與編輯框關鍵字相同的內容,
            ??? ?? 如果有相同內容則不添加,如果沒有相同內容則寫文件.
            ------------------------------------- ------------*/

            void CDlgBankList::OnBtnAdd() 
            {
            ?????? // TODO: Add your control notification handler code here
            ?????? CString? strKey;
            ?????? GetDlgItemText(IDC_EDITBank,strKey);
            ?????? if (0 != strKey.GetLength())
            ?????? {
            ????????? CBank? *pB;
            ????????? //打開文件
            ????? ?? UINT? nFlags = CFile::typeBinary |CFile::modeRead;
            ????????? CFile file;
            ????????? CFileException fe;
            ????????? if (file.Open(_T("BankName.dat"),nFlags, &fe))
            ????????? {
            ???????????????? if(file.GetLength()==0)? //如果文件為空則不進行序列化操作
            ???? ??????????? {

            ???????????????? }
            ???????????????? else
            ???????????????? {
            ????????????????? CArchive ar(&file, CArchive::load);
            ????????????????? m_map.Serialize(ar);
            ???????????????? }
            ?????????????? //分析文件并給文件添加編輯框的內容
            ???? ?????????? if(!m_map.Lookup(strKey,(CBank*)pB))? //當不存在時才需要添加
            ????? ??????????? {
            ????????????????????? if (CB_ERR != m_ListBox.AddString(strKey))
            ????????????????????? {
            ???????????????????????? m_map.SetAt(strKey, new CBank(strKey));? //給關鍵字strKey賦值
            ???? ???????????????? }
            ???????????????? }
            ????????? }
            ?????? file.Close();

            ?????? //存儲文件
            ???? nFlags = CFile::typeBinary |CFile::modeWrite;
            ?????? if (file.Open(_T("BankName.dat"),nFlags, &fe))
            ?????? {
            ??????????? CArchive ar(&file, CArchive::store);
            ??????????? m_map.Serialize(ar);?? //序列化存儲
            ???? }
            ??? }
            }

            /*-------------------------------------------------
            功能: 先打開文件,然后查找文件中的關鍵字,
            ????找到后則刪除此關鍵字, 但是注意關鍵字對應的內容仍然沒有刪除,這點期待改進.
            -------------------------------------------------*/

            void CDlgBankList::OnBtnDel() 
            {
            ?????? // TODO: Add your control notification handler code here
            ?????? int iIndex;??????
            ?????? CString? strKey;
            ?????? if(LB_ERR!=m_ListBox.GetCurSel())
            ?????? {
            ??????? //打開文件
            ?????& nbsp;???? UINT? nFlags = CFile::typeBinary |CFile::modeRead;
            ?????????? CFile file;
            ?????????? CFileException fe;
            ?????????? if (file.Open(_T("BankName.dat"),nFlags, &fe))
            ?????????? {
            ????????????? CArchive ar(&file, CArchive::load);
            ????????????? m_map.Serialize(ar);?
            ????????????? iIndex=m_ListBox.GetCurSel();
            ????????????? m_ListBox.GetText(iIndex,strKey);
            ????????????? m_ListBox.DeleteString(iIndex);
            ????????????? //分析文件并給文件添加編輯框的內容
            ???? ????????? CBank? *pB=NULL;
            ????????????? if(m_map.Lookup(strKey,(CBank*)pB))
            ????????????? {
            ????????????????? m_map.RemoveKey(strKey);?? //刪除關鍵字,但沒有刪除關鍵字對應的內容
            ???? ????????? }
            ??????????? }
            ??????????? file.Close();
            ??????????? //存儲文件
            ????? ???? nFlags = CFile::typeBinary |CFile::modeWrite;
            ?????????? if (file.Open(_T("BankName.dat"),nFlags, &fe))
            ?????????? {
            ??????????????? CArchive ar(&file, CArchive::store);
            ??????????????? m_map.Serialize(ar);?? //序列化存儲
            ????? ???? }
            ?????? }
            }

            posted on 2006-06-23 23:07 讓心飛翔 閱讀(1936) 評論(0)  編輯 收藏 引用 所屬分類: 編程經驗
            伊人久久大香线蕉综合网站| 久久综合九色综合网站| 99热精品久久只有精品| 亚洲国产成人久久综合一区77| 亚洲欧美一级久久精品| 国产成人精品久久二区二区| 久久影院午夜理论片无码| 久久亚洲私人国产精品| 欧洲国产伦久久久久久久| 久久精品蜜芽亚洲国产AV| 欧美色综合久久久久久| 久久综合丁香激情久久| 无码伊人66久久大杳蕉网站谷歌| 国产A级毛片久久久精品毛片| 国产毛片欧美毛片久久久| 久久久久亚洲AV成人网人人网站| 久久久国产乱子伦精品作者| 久久久久波多野结衣高潮| 久久国产精品二国产精品| 久久99精品国产| 久久久久99精品成人片欧美| 欧美日韩久久中文字幕| 久久久久久亚洲精品不卡| 99热热久久这里只有精品68| 久久久久久亚洲Av无码精品专口| 久久精品国产男包| 亚洲色婷婷综合久久| 久久国产欧美日韩精品| 无码人妻久久一区二区三区蜜桃| 久久综合一区二区无码| 成人精品一区二区久久| 777久久精品一区二区三区无码 | 欧美精品一本久久男人的天堂| 狠狠精品久久久无码中文字幕| 久久91精品国产91久| 久久国产亚洲精品| 久久99热这里只有精品国产| 亚洲AV无一区二区三区久久| 久久综合九色综合网站| 久久综合九色综合精品| 国产99久久九九精品无码|