程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 不用VC中的Document能否存儲數據

不用VC中的Document能否存儲數據

編輯:vc教程

(本文只適合初學者閱讀,如果你是高手,而且你非要看,那就當成是茶余飯後的消遣吧.:-))

我剛開始學VC的時候一直被那讓人頭痛的Document/VIEw結構給搞的頭暈.

真的,我還記得第一次使用串行輸出,ar<<m_xxx;這樣的東西,當時我怎麼也搞不明白,是個怎麼會事情.後來,我知道是CArchive重載了<<和>>兩個操作符.作用是吧,對象中的數據永久保存到磁盤上(說句笑話,這裡永久是相對的如果你把磁盤格式化一樣什麼也沒了).可是這些一般都是在CDocument類的派生類中重寫Serialize函數來完成的.這是很自然,因為CDocument可以理解是一個文件的抽象形式而View則正是需要Document提供的數據,來完成對用戶的顯示.可是想想.如果,我是如果,有一天用戶都是瞎子,或者他們不想看所有的數據,那要是還是吧,那些要顯示和不要顯示的數據都放在CDocument類中嗎?那樣結構顯然是有點亂.是的,CDocument完全是因為要和CView進行交互才必須要用到的.那麼好吧,雖然不要用戶看見那些數據,可是又必須要保存的數據,我們該怎麼辦?是啊,誰都想的到,一定要用到Serialize否則什麼也無法進行根據MSDN的說法.要擁有Serialize必須要從CObject類派生類才可以那樣做.還要什麼想想看當然是一個SaveData和一個LoadData了,要知道我們只是不想讓用戶來干預,而不是不處理這些數據,也就是說這些數據僅僅只是不和VIEw打交道.那麼好吧,我還是來點例子,那樣會更有說服力我先在CSerData.hclass CSerData : public CObject{
DECLARE_SERIAL(CSerData)//千萬別忘了這個宏否則什麼也做不了(建議參考<<深入淺出MFC>>)

public:

    virtual void Serialize(CArchive& ar);
    int m_nID;
    CString m_strName;
    Bool m_IsSave=False;
    SaveData();
    LoadData();
};

瞧見了,我要改寫Serialize那個虛函數.要不怎麼能完成我們自己的事情呢?還有我添加了兩個要存儲的數據,一個int和一個CString,你可以把它想象成,一個唯一標示的ID和一個可以相同的名字.你甚至可以把它想象成,一份黑名單,一個凡是讓你討厭的用戶的名單列表可你不會傻到要那些用戶看見,否則他就會去修改這些數據了.呵呵..當然這是打個比方.下面我們來實現CPP文件.

#include "stdafx.h"
#include "CSerData.h"

IMPLEMENT_SERIAL(CInfo,CObject,1)

void CInfo::Serialize(CArchive& ar)
{
    if (ar.IsLoading()) // If you are loading data from the disk
    {
        ar >> m_strName;
        ar >> m_nID;
    }
    else // If you are storing data to the disk
    {
        ar << m_strName;
        ar << m_nID;
    }
}


就想你常做的那樣,僅僅只是ar<<m_xxxx;和在CDocument中的一樣,當然,這是必須的.接下來,看看我們還要做點什麼?別忘了,如果不把它們寫到文件裡,你也別想知道那些用戶進了黑名單.記得這文件只有你才打的開.好吧,還記得,我在CSerData.H中的 SaveData();和LoadData();,這兩個函數嗎?是的,它們就是來完成這一工作的(也許把它們寫到類的外面成為一個全局函數更為符合C++風格.可我覺得真正的OO應該寫類內)如果你不願意那樣做,你可以寫到外面,我想只要你願意,編譯器也不發火,沒人管的著你.

#define DATA_FILE _T("DataTest.dat")


void SaveData()                 
//  Code to serialize and save the data
{
    UINT nFlags = CFile::typeBinary | CFile::modeWrite;

    if (_Access(DATA_FILE, 0))
    {
        nFlags |= CFile::modeCreate;           
        // The file doesn't exist, so create it
       
        m_bCanSave = TRUE;
    }
    else
    {
        int nTemp = _Access(DATA_FILE, 6); 
        // Check Read Write Permissions

        if(nTemp==0)
            m_bCanSave = TRUE;
    }

    if (m_bCanSave)
    {
        CFile file;
        CFileException fe;

        // The file exists with read & write permissions
        if (file.Open(DATA_FILE, nFlags, &fe))
        {
            CArchive ar(&file, CArchive::store);
            UpdateData(TRUE);
            CSerData.m_nID = m_nID;
            CSerData.m_strName = m_strName;
            CSerData.Serialize(ar); // Serialize the data
        }
    }  
}

上面的save操作已經結束,我想該是load的時候了

void LoadData()
//Code to load data

{
    if (_Access(DATA_FILE, 6)==0) // If File Exists
    {
        CFile file;
        CFileException fe;

        if (file.Open(DATA_FILE,CFile::typeBinary |
            CFile::modeRead, &fe))
        {
            CArchive ar(&file, CArchive::load);
            Info.Serialize(ar);
        }

    }

    m_nID = CSerData.m_nID;
    m_strName = CSerData.m_strName;
    UpdateData(FALSE);
}

終於寫完了,希望不是那麼糟糕.希望有點人氣度.我在上面說了,本文只適合初學者如果你是高手,讀到這兒.就已經說明,你今天很閒,或者你是來找點茶余飯後的消遣那好吧,我的文章希望就能帶給你們這麼多,下次見.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved