freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

第6章數(shù)據(jù)和文檔-資料下載頁

2025-07-20 12:25本頁面
  

【正文】 theFile。 (..., CFile::modeWrite)。 CArchive archive(amp。theFile, CArchive::store)。 其中, CArchive構(gòu)造函數(shù)的原型如下: CArchive( CFile* pFile, UINT nMode, int nBufSize = 4096, void* lpBuf = NULL )。 參數(shù) pFile用來指定與之關(guān)聯(lián)的文件指針。 nBufSize表示內(nèi)部文件的緩沖區(qū)大小,默認值為 4096字節(jié)。 lpBuf表示自定義的緩沖區(qū)指針,若為 NULL,則表示緩沖區(qū)建立在堆內(nèi)存中,當對象清除時,緩沖區(qū)內(nèi)存也被釋放;若指明用戶緩沖區(qū),對象消除時,緩沖區(qū)內(nèi)存不會被釋放。 nMode用來指定文檔是用于存入還是讀取,它可以是CArchive::load(讀取數(shù)據(jù))、 CArchive::store(存入數(shù)據(jù))或 CArchive::bNoFlushOnDelete(當析構(gòu)函數(shù)被調(diào)用時,避免文檔自動調(diào)用 Flush 。若設置這個標志,則必須在析構(gòu)函數(shù)被調(diào)用之前調(diào)用 Close。否則文件數(shù)據(jù)將被破壞)。 也可將一個 CArchive 對象與 CFile類指針相關(guān)聯(lián),如下面的代碼( ar是 CArchive 對象): const CFile* fp = ()。 在用文件來存取數(shù)據(jù)時,最大的難度是要保證讀取的數(shù)據(jù)的正確性。若有一個記錄結(jié)構(gòu),包括學生的姓名(字符串)、學號(字符串)以及三門課程成績,則如何保證在文件讀寫的正確性呢?一種辦法是將記錄定義成 C結(jié)構(gòu)體類型,使用 CFile來操作,這是避開 MFC文檔序列化機制而進行的方法,雖有效但缺少對 MFC機制和類的應用,因為在 C++中, C結(jié)構(gòu)體被看作是類的一種簡單形式。另一種方法,是將記錄聲明成一個類,并使該類具體可序列化特性。一個可序列化的類的對象可以在 Serialize函數(shù)使用CArchive對象通過“ ”和“ ”來正確地向文件進行寫入和讀取操作。 圖 Ex_Student運行結(jié)果 下面來看一個綜合應用,如圖 。它首先通過對話框來輸入一個學生記錄,記錄包括學生的姓名、學號和三門成績,用類 CStudent來描述,并使其可序列化。然后將記錄內(nèi)容保存到一個對象數(shù)組集合類對象中,最后通過文檔序列化將記錄保存到一個文件中。當添加記錄或打開一個記錄文件,還會將數(shù)據(jù)顯示在文檔窗口(即視圖)中。 [例 Ex_Student] 文檔序列化示例 1)添加用于學生記錄輸入的對話框 ( 1)創(chuàng)建一個默認的單文檔應用程序 Ex_Student。 ( 2)向應用程序中添加一個對話框資源,打開屬性對話框?qū)⑵渥煮w設置為“宋體,9”,標題改為“添加學生記錄”,取默認的 ID號 IDD_DIALOG1,將 OK和 Cancel按鈕的標題分別改為“確 定”和“取 消”。 ( 3)參看圖 ,用編輯器為對話框添加如下表 。 表 添加的控件 控 件 ID號 標 題 屬 性 靜態(tài)文本 默認 姓名: 默認 靜態(tài)文本 默認 學號: 默認 靜態(tài)文本 默認 成績 1: 默認 靜態(tài)文本 默認 成績 2: 默認 靜態(tài)文本 默認 成績 3: 默認 編輯框 IDC_EDIT1 —— 默認 編輯框 IDC_EDIT2 —— 默認 編輯框 IDC_EDIT3 —— 默認 編輯框 IDC_EDIT4 —— 默認 編輯框 IDC_EDIT5 —— 默認 靜態(tài)圖片 默認 —— Frame, Etched, 其余默認 ( 4)雙擊對話框模板或按 Ctrl+W快捷鍵,為對話框資源 IDD_DIALOG1創(chuàng)建一個對話框類 CInputDlg。 ( 5)打開 ClassWizard的 Member Variables標簽,在 Class name中選擇 CInputDlg,選中所需的控件 ID標識符,雙擊鼠標或單擊 Add Variables按鈕。依次為表 員變量。 表 控件變量 控件 ID號 變量類型 變量名 范圍和大小 IDC_EDIT1 CString m_strName 20 IDC_EDIT2 CString m_strID 20 IDC_EDIT3 float m_fScore1 0~100 IDC_EDIT4 float m_fScore2 0~100 IDC_EDIT5 float m_fScore3 0~100 2)添加一個 CStudent類并使該類可序列化 一個可序列化的類必須是 CObject的一個派生類,且在類聲明中,需要包含DECLARE_SERIAL宏調(diào)用,而在類的實現(xiàn)文件中包含 IMPLEMENT_SERIAL宏調(diào)用,這個宏有 3個參數(shù):前 2個參數(shù)分別表示類名和基類名,第 3個參數(shù)表示應用程序的版本號。最后還需要重載 Serialize函數(shù),使該類的數(shù)據(jù)成員進行相關(guān)序列化操作。 由于使用 ClassWizard無法添加一個 CObject派生類,因此必須手動進行。為了簡化類文件的復雜性,這里創(chuàng)建的這個 CStudent類的聲明和實現(xiàn)代碼是直接添加在 , 具體如下 : 3)添加并處理菜單項 ( 1)在菜單資源的主菜單中增加頂層菜單項“學生記錄 (amp。S)”,在該頂層菜單項中增加子菜單“添加 (amp。A)”(ID_STUREC_ADD)。 ( 2)用 ClassWizard為 CEx_StudentDoc類添加 ID_STUREC_ADD的 COMMAND消息映射,并在映射函數(shù)中添加下列代碼: void CEx_StudentDoc::OnSturecAdd() { CInputDlg dlg。 if (IDOK == ()) { // 添加記錄 CStudent *pStudent = new CStudent(, , , , )。 (pStudent)。 SetModifiedFlag()。 // 設置文檔更改標志 UpdateAllViews(NULL)。 // 更新視圖 } } ( 3)在 ,增加包含 CAddDlg的頭文件。 include include ( 1)在 ,為 CEx_StudentDoc類添加下列成員變量和成員函數(shù): public: CObArray m_stuObArray。 int GetAllRecNum(void)。 CStudent * GetStudentAt(int nIndex)。 ( 2)在 ,添加函數(shù)的實現(xiàn)代碼: CStudent * CEx_StudentDoc::GetStudentAt(int nIndex) { if ((nIndex 0) || nIndex ()) return 0。 // 超界處理 return (CStudent *)(nIndex)。 } int CEx_StudentDoc::GetAllRecNum() { return ()。 } 3)完善代碼 ( 3)在 CEx_StudentDoc析構(gòu)函數(shù)中添加下列代碼: CEx_StudentDoc::~CEx_StudentDoc() { int nIndex = GetAllRecNum()。 while (nIndex) delete (nIndex)。 ()。 } ( 4)在 Serialize函數(shù)中添加下列代碼: void CEx_StudentDoc::Serialize(CArchiveamp。 ar) { if (()) { (ar)。 } else { (ar)。 } } 需要說明的是, m_stuObArray是一個對象數(shù)組集合類 CObArray的對象,當讀取數(shù)據(jù)時調(diào)用 Serialize成員函數(shù)時,它實際上是調(diào)用集合類對象中的元素的 Serialize成員函數(shù),并將對象添加到 m_stuObArray中。那么它又是怎么知道元素是調(diào)用 CStudent類的Serialize成員函數(shù)呢?這是因為當添加學生成績記錄后,一旦保存到文件中,就會將CStudent類名同時存在到文件中,當讀取時,就會自動使用 CStudent類。這是 CObArray序列化的一個內(nèi)部機制。 ( 5)在 CEx_StudentView::OnDraw函數(shù)中添加下列代碼: void CEx_StudentView::OnDraw(CDC* pDC) { CEx_StudentDoc* pDoc = GetDocument()。 ASSERT_VALID(pDoc)。 int y = 0。 for (int nIndex = 0。 nIndex pDocGetAllRecNum()。 nIndex++) { pDocGetStudentAt(nIndex)Display(y, pDC)。 y += 16。 } } ( 6)打開文檔的字串資源 IDR_MAINFRAME,將其內(nèi)容修改為: Ex_Student\nStudentRec\nEx_Stu\n記錄文件 (*.rec)\\\nEx _Stu Document ( 7)編譯運行并測試,結(jié)果如前圖 。 習題 1. 試舉例說明 MFC簡單數(shù)組集合類的查找和修改方法。 2. 文檔字串資源有哪些含義?如何編輯字串資源? 3. 若想通過對文檔字串資源的更改,使應用程序的“打開”或“保存”對話框中的文件類型顯示為“ C源文件 (*.c,*.cpp)”,則應如何實現(xiàn)? 4. 什么是文檔的序列化?其過程是怎樣的? 5. 若有一個學生記錄,包括學生的姓名(字符串)、學號(字符串)和三門成績。若將它的記錄數(shù)據(jù)轉(zhuǎn)換成 CString字符串,則如何轉(zhuǎn)換? 6. 若有非空的 CString字符串,能不能在文檔類中的 Serialize函數(shù)里使用CArchiveamp。 ar對象的“ ”和“ ”來將字符串寫入文檔或從文檔讀?。繛槭裁?? 7. 上機練習最后的綜合應用實例 Ex_Student。
點擊復制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1