• <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++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              7 Posts :: 0 Stories :: 13 Comments :: 0 Trackbacks

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

            你必須在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;} //拷貝構(gòu)造函數(shù)
            ????? ? virtual ~CBank();
            private:
            ?????? CString? m_bankname;
            public:
            ??? virtual void Serialize(CArchive& ar);
            };

            typedef CTypedPtrMap<CMapStringToOb,

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

            ???????????????????? CBank*>CBanktmp;? //這個(gè)才是我們根據(jù)此類生成的類型

            它的實(shí)現(xiàn)文件.cpp如下:

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

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

            /*----------------------------------------------------
            從文件中讀取參數(shù):
            注意: 其中的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)?? //如果文件為空則不進(jìn)行讀取操作
            ???? ????? {
            ?????????? }
            ?????????? else
            ?????????? {
            ??????????????? CArchive ar(&file, CArchive::load);
            ??????????????? m_map.Serialize(ar);?? //讀取文件
            ?????????????? //根據(jù)文件內(nèi)容填充列表框
            ???? ?????????? 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();
            }

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

            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)? //如果文件為空則不進(jìn)行序列化操作
            ???? ??????????? {

            ???????????????? }
            ???????????????? else
            ???????????????? {
            ????????????????? CArchive ar(&file, CArchive::load);
            ????????????????? m_map.Serialize(ar);
            ???????????????? }
            ?????????????? //分析文件并給文件添加編輯框的內(nèi)容
            ???? ?????????? if(!m_map.Lookup(strKey,(CBank*)pB))? //當(dāng)不存在時(shí)才需要添加
            ????? ??????????? {
            ????????????????????? if (CB_ERR != m_ListBox.AddString(strKey))
            ????????????????????? {
            ???????????????????????? m_map.SetAt(strKey, new CBank(strKey));? //給關(guān)鍵字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);?? //序列化存儲
            ???? }
            ??? }
            }

            /*-------------------------------------------------
            功能: 先打開文件,然后查找文件中的關(guān)鍵字,
            ????找到后則刪除此關(guān)鍵字, 但是注意關(guān)鍵字對應(yīng)的內(nèi)容仍然沒有刪除,這點(diǎn)期待改進(jìn).
            -------------------------------------------------*/

            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);
            ????????????? //分析文件并給文件添加編輯框的內(nèi)容
            ???? ????????? CBank? *pB=NULL;
            ????????????? if(m_map.Lookup(strKey,(CBank*)pB))
            ????????????? {
            ????????????????? m_map.RemoveKey(strKey);?? //刪除關(guān)鍵字,但沒有刪除關(guān)鍵字對應(yīng)的內(nèi)容
            ???? ????????? }
            ??????????? }
            ??????????? 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 讓心飛翔 閱讀(1930) 評論(0)  編輯 收藏 引用 所屬分類: 編程經(jīng)驗(yàn)
            99久久精品免费| 久久久久亚洲AV片无码下载蜜桃| 99久久免费只有精品国产| 99久久人人爽亚洲精品美女| 亚洲精品国产综合久久一线| 久久久久久久波多野结衣高潮| 欧美一区二区三区久久综合| 国产精品美女久久久免费| 久久丫忘忧草产品| 久久精品a亚洲国产v高清不卡| 久久精品一区二区国产| 免费精品久久久久久中文字幕 | 久久久久亚洲AV无码专区首JN| av国内精品久久久久影院| 日韩电影久久久被窝网| 久久国产精品一国产精品金尊| 久久精品视屏| 久久永久免费人妻精品下载| 久久精品亚洲福利| 国产精品久久久亚洲| 少妇熟女久久综合网色欲| 日韩欧美亚洲综合久久影院d3| 久久久无码精品亚洲日韩蜜臀浪潮| 亚洲国产成人久久精品动漫| 中文字幕日本人妻久久久免费 | 国产精品久久久久a影院| 欧美综合天天夜夜久久| 久久久噜噜噜久久中文字幕色伊伊| 久久97久久97精品免视看秋霞| 久久精品国产清高在天天线| 国产精品久久久久a影院| 久久久黄片| 久久久久久狠狠丁香| 久久综合给合久久国产免费 | 99久久精品费精品国产一区二区| 久久亚洲日韩看片无码| 欧美久久亚洲精品| 国产一区二区精品久久岳| 国产精品久久99| 午夜不卡久久精品无码免费| 国产精品久久久久久久久软件 |