• <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 讓心飛翔 閱讀(1929) 評論(0)  編輯 收藏 引用 所屬分類: 編程經驗
            久久精品黄AA片一区二区三区| 久久一日本道色综合久久| 久久精品国产91久久综合麻豆自制| 久久99国产综合精品女同| 亚洲狠狠综合久久| 麻豆精品久久久久久久99蜜桃| 久久99国产精品久久99小说| 久久精品国产亚洲av高清漫画| 久久免费视频网站| 人妻无码中文久久久久专区| 久久99久久成人免费播放| 亚洲中文字幕无码久久综合网| 久久福利青草精品资源站免费 | 亚洲乱码日产精品a级毛片久久 | 国产三级观看久久| 久久精品亚洲中文字幕无码麻豆| 久久国产精品一区| 99久久精品午夜一区二区| 免费精品久久天干天干| 亚洲国产成人精品女人久久久 | 日本精品久久久中文字幕| 精品久久久久成人码免费动漫| 国产精品99久久久久久猫咪| 久久久久久久久无码精品亚洲日韩| 亚洲第一永久AV网站久久精品男人的天堂AV | 狠狠精品久久久无码中文字幕| 久久久精品日本一区二区三区 | 热久久视久久精品18| 国内精品久久久久久中文字幕| 久久中文字幕人妻丝袜| 久久亚洲国产欧洲精品一| 久久精品人人做人人爽97| 久久午夜福利无码1000合集| 亚洲欧洲精品成人久久奇米网| 久久午夜无码鲁丝片午夜精品| 精品无码久久久久久国产| 香港aa三级久久三级| 91精品国产91久久久久久蜜臀| 免费国产99久久久香蕉| 青青青伊人色综合久久| 久久99热这里只有精品国产|