第11章文件處理_第1頁(yè)
第11章文件處理_第2頁(yè)
第11章文件處理_第3頁(yè)
第11章文件處理_第4頁(yè)
第11章文件處理_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第11章 文件處理在Windows中,各種數(shù)據(jù)及信息都存儲(chǔ)在文件中。因此在Windows下的程序一般情況下都需要對(duì)文件進(jìn)行數(shù)據(jù)的存儲(chǔ)和讀取。學(xué)習(xí)本章,讀者可以掌握C+程序文件輸入輸出的基本方法,以及利用MFC中的CFile類對(duì)文件進(jìn)行操作的基本方法。11.1 文件的輸入輸出文件的輸入輸出是文件的基本操作。在C+中,文件的輸入輸出是十分簡(jiǎn)單的事情。本節(jié)介紹C+中文件的輸入輸出操作的基本知識(shí)。11.1.1 C+對(duì)文件操作的支持C+把文件看做是字符序列,也就是說(shuō)文件是由一個(gè)個(gè)字符數(shù)據(jù)順序組成的。根據(jù)數(shù)據(jù)的組織形式,文件分為文本文件和二進(jìn)制文件。文本文件的每個(gè)字節(jié)存放一個(gè)ASCII碼,代表一個(gè)字符。二

2、進(jìn)制文件則是把內(nèi)存中的數(shù)據(jù),按其在內(nèi)存中的樣子寫到磁盤中。文本文件是每個(gè)字節(jié)存放一個(gè)ASCII,即一個(gè)字節(jié)對(duì)應(yīng)于一個(gè)字符,這樣可以很方便地進(jìn)行操作,而二進(jìn)制文件并不是每一個(gè)字節(jié)都對(duì)應(yīng)一個(gè)字符,因此不可以以字符形式直接進(jìn)行輸出。但是二進(jìn)制文件比文本文件占用空間小,因此在程序中經(jīng)常用來(lái)保存一些中間結(jié)果,這些內(nèi)容有時(shí)需要再次送入內(nèi)存。在C+中要進(jìn)行文件的輸入輸出,需要首先創(chuàng)建一個(gè)流,然后將這個(gè)流與文件相關(guān)聯(lián),即打開(kāi)文件。這時(shí)就可以對(duì)文件進(jìn)行操作,操作完成后關(guān)閉文件。11.1.2 文件的打開(kāi)與關(guān)閉在利用Visual C+進(jìn)行文件操作之前都需要首先打開(kāi)文件。打開(kāi)文件之后才可以對(duì)文件進(jìn)行操作,當(dāng)操作結(jié)束時(shí)

3、還需要關(guān)閉文件。下面對(duì)文件打開(kāi)和關(guān)閉的基本過(guò)程進(jìn)行介紹。1文件的打開(kāi)在C+中文件的打開(kāi)實(shí)際上就是將文件與一個(gè)流對(duì)象關(guān)聯(lián)起來(lái),C+提供了3個(gè)標(biāo)準(zhǔn)的流類,3個(gè)流類列表如表11.1所示。表11.1 C+的流類名名 稱稱基基 類類作作 用用ofstreamostream文件的輸出文件的輸出ifstreamistream文件的輸入文件的輸入fstreamiostream文件的輸入或輸出文件的輸入或輸出在C+中,文件的打開(kāi)一般需要進(jìn)行下面幾步:(1)建立流對(duì)象。C+提供了3個(gè)標(biāo)準(zhǔn)的輸入輸出流,可以利用這些流類建立需要的對(duì)象。(2)使用流類的成員函數(shù)open()打開(kāi)文件。其原型如下:void open( c

4、onst char* szName, int nMode, int nProt = filebuf:openprot ); 各個(gè)參數(shù)的含義分別為:szName表示文件名。nMode表示打開(kāi)方式,它的取值為表11.2的一個(gè)或者幾個(gè)。表11.2 nMode的取值及其含義需要注意的是當(dāng)利用此open()函數(shù)打開(kāi)的文件不存在時(shí),應(yīng)用程序會(huì)新建一個(gè)文件,然后再進(jìn)行打開(kāi)。當(dāng)需要以一種以上的方式打開(kāi)文件時(shí),即nMode的取值有多個(gè),需要用“|”連接起來(lái),這樣就可以以多種方式打開(kāi)文件。注意:在Visual C+中使用C+的標(biāo)準(zhǔn)流類,需要包含頭文件iostream.h。nMode的取值的取值說(shuō)說(shuō) 明明ios:a

5、pp輸出追加到文件尾輸出追加到文件尾ios:ate查找文件尾查找文件尾ios:in打開(kāi)文件進(jìn)行讀操作打開(kāi)文件進(jìn)行讀操作ios:nocreate文件不存在,則打開(kāi)失敗文件不存在,則打開(kāi)失敗ios:noreplace文件存在,打開(kāi)失敗文件存在,打開(kāi)失敗ios:out打開(kāi)文件進(jìn)行寫操作打開(kāi)文件進(jìn)行寫操作ios:trunc刪除文件后重新新建文件刪除文件后重新新建文件ios:binary文件以二進(jìn)制形式打開(kāi)文件以二進(jìn)制形式打開(kāi)2文件的關(guān)閉在對(duì)文件的輸入輸出完成以后,需要關(guān)閉文件,即取消流對(duì)象和文件之間的關(guān)聯(lián)。文件的關(guān)閉需要使用close()函數(shù)。close()是流類的成員函數(shù),它的使用非常簡(jiǎn)單,沒(méi)有參數(shù)

6、,也沒(méi)有返回值。11.1.3 文本文件的輸入和輸出在打開(kāi)文件以后,就可以對(duì)文件進(jìn)行輸入操作,即寫操作。使用運(yùn)算符“”,就可以將內(nèi)容輸入到文件。在C+中對(duì)屏幕的輸出使用的是cout”,其他的含義是完全相同的?!臼纠?1.1】將110這10個(gè)整數(shù)輸入到文件中。新建一個(gè)控制臺(tái)應(yīng)用程序,編寫代碼如下:程序運(yùn)行后,屏幕上并不顯示任何內(nèi)容,因?yàn)檩敵龅膬?nèi)容保存在文件中。打開(kāi)當(dāng)前目錄下的文件num,可以看到文件中的內(nèi)容如下:12345678910上面的例子是先建立一個(gè)輸出文件,然后寫入數(shù)據(jù),最后關(guān)閉文件。可以看到文件中已保存了輸出的內(nèi)容。11.1.4 二進(jìn)制文件的輸入和輸出任何文件都可以以二進(jìn)制形式打開(kāi),文本

7、文件是字符流,而二進(jìn)制文件是字節(jié)流。在默認(rèn)情況下,文件的打開(kāi)方式是以文本文件的形式。如果需要指定以二進(jìn)制文件打開(kāi)文件,只需要在open()函數(shù)時(shí)指定方式為ios:binary方式。對(duì)二進(jìn)制文件的讀寫有兩種方式,一種是使用get()和put()函數(shù),另一種是使用read()和write()函數(shù)。這四個(gè)函數(shù)也可以用于文本文件的讀寫,其使用方式與二進(jìn)制文件的使用區(qū)別不大。1get()和put()函數(shù)的使用get()是輸入流類istream的成員函數(shù),它可以從流對(duì)象連接的文件中讀出數(shù)據(jù),每次讀取一個(gè)字節(jié)。put()是輸出流類ostream的成員函數(shù),它可以向流對(duì)象連接的文件寫入數(shù)據(jù)。get()和put

8、()函數(shù)的原型如下:istream& get( unsigned char& ruch );每次讀入一個(gè)字節(jié),并且放入rush中。ostream& put( char ch );將字符ch寫入到文件中。2read()和write()函數(shù)的使用read()和write()函數(shù)可以用來(lái)讀寫一個(gè)塊數(shù)據(jù),即可以讀寫結(jié)構(gòu)體、數(shù)組等。其原型如下:istream& read( char* pch, int nCount );istream& read( unsigned char* puch, int nCount );istream& read( signe

9、d char* psch, int nCount );這個(gè)函數(shù)的第一個(gè)參數(shù)是塊數(shù)據(jù)的首字節(jié)地址,第二個(gè)參數(shù)是讀入的字節(jié)數(shù)。ostream& write( const char* pch, int nCount );ostream& write( const unsigned char* puch, int nCount );ostream& write( const signed char* psch, int nCount );這個(gè)函數(shù)參數(shù)的意義和read()函數(shù)的參數(shù)的意義完全相同,只不過(guò)這個(gè)函數(shù)是將數(shù)據(jù)寫入文件?!臼纠?1.2】 將存放a到e的5個(gè)字符的數(shù)組寫入文

10、件。新建一個(gè)控制臺(tái)應(yīng)用程序,編寫代碼如下:分析:程序運(yùn)行后,屏幕上并不顯示任何內(nèi)容,因?yàn)檩敵龅膬?nèi)容保存在文件中,打開(kāi)當(dāng)前目錄下的文件num,可以看到文件中的內(nèi)容如下:abcde本節(jié)介紹了在Visual C+中進(jìn)行文件操作的基本函數(shù)和過(guò)程。在MFC中對(duì)這些操作以C+類的形式進(jìn)行了封裝,使得文件的操作更加簡(jiǎn)單和方便。在11.2節(jié)中將會(huì)看到使用MFC封裝的文件類進(jìn)行文件操作的基本方法和過(guò)程。11.2 CFile類在MFC中利用C+類的形式封裝了對(duì)各種各樣的文件的操作。其中CFile類是文件操作的基類,提供了對(duì)普通文件進(jìn)行的操作。11.2.1 初識(shí)CFile類在MFC中利用C+類的形式封裝了對(duì)各種各樣

11、的文件的操作。常見(jiàn)的類有下面幾種。CFile:文件類的基類,封裝了二進(jìn)制磁盤文件的操作。CStdioFile:封裝了對(duì)緩沖流文件的操作。CMemFile:封裝了對(duì)內(nèi)存文件的操作。CShareFile:封裝了對(duì)共享內(nèi)存文件的操作。COleStreamFile:封裝了使用COMM Istream接口對(duì)復(fù)合文件的操作。CSocketFile:封裝了對(duì)Windows Socket提供的操作。說(shuō)明:CFile類是CObject的派生類,因此它支持串行化操作。在應(yīng)用中可以使用串行化操作保存文件。CFile類是文件類的基類,它封裝了對(duì)磁盤文件進(jìn)行的操作,其成員函數(shù)如表11.3所示。表11.3 CFile的主

12、要成員函函 數(shù)數(shù)說(shuō)說(shuō) 明明CFile( LPCTSTR lpszFileName, UINT nOpenFlags );構(gòu)造函數(shù)構(gòu)造函數(shù)virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL );打開(kāi)文件打開(kāi)文件virtual void Close();關(guān)閉文件關(guān)閉文件virtual UINT Read( void* lpBuf, UINT nCount );讀入讀入nCount字節(jié)大小的內(nèi)容字節(jié)大小的內(nèi)容DWORD ReadHuge( void* lpBuffer, DWO

13、RD dwCount );讀入讀入dwCount字節(jié)大小的內(nèi)容字節(jié)大小的內(nèi)容virtual void Write( const void* lpBuf, UINT nCount );寫入寫入nCount字節(jié)大小的內(nèi)容字節(jié)大小的內(nèi)容void WriteHuge( const void* lpBuf, DWORD dwCount );寫入寫入dwCount字節(jié)大小的內(nèi)容字節(jié)大小的內(nèi)容virtual LONG Seek( LONG lOff, UINT nFrom );定位到指定位置的定位到指定位置的nFrom處處void SeekToBegin();定位到文件頭定位到文件頭DWORD SeekTo

14、End();定位到文件尾定位到文件尾virtual DWORD GetLength() const;得到文件大小得到文件大小virtual void SetLength( DWORD dwNewLen );設(shè)置文件大小設(shè)置文件大小virtual DWORD GetPosition() const;得到文件指針的位置得到文件指針的位置virtual CString GetFileName() const;得到文件名得到文件名static void PASCAL Rename( LPCTSTR lpszOldName, LPCTSTR lpszNewName );修改文件名修改文件名static

15、void PASCAL Remove( LPCTSTR lpszFileName );刪除文件刪除文件使用CFile類可以方便地進(jìn)行文件操作,其中文件操作中需要首先打開(kāi)文件,文件的打開(kāi)方式是一個(gè)需要注意的問(wèn)題。Open函數(shù)中參數(shù) nOpenFlags的常用取值為以下的一個(gè)或幾個(gè)。 CFile:modeCreate:打開(kāi)文件時(shí),如果文件不存在則新建一個(gè)文件。CFile:modeNoTruncate:普通方式打開(kāi)文件。CFile:modeRead:只讀方式打開(kāi)文件。CFile:modeReadWrite:文件可讀可寫。CFile:modeWrite:只寫方式打開(kāi)文件。11.2.2 使用CFile類

16、前面介紹了CFile類的基本成員,下面結(jié)合實(shí)例對(duì)CFile類的使用進(jìn)行介紹?!臼纠?1.3】 在對(duì)話框中利用CFile類實(shí)現(xiàn)保存在編輯框中輸入的內(nèi)容,單擊“顯示”按鈕后,在文件中保存該內(nèi)容,并且在另一個(gè)對(duì)話框中輸出文件的所有內(nèi)容。操作步驟如下:(1)新建一個(gè)基于對(duì)話框的應(yīng)用程序。(2)在資源編輯環(huán)境中添加兩個(gè)編輯框和一個(gè)按鈕控件。(3)添加單擊按鈕控件的消息映射,編寫函數(shù)體如下:分析:上面代碼首先將編輯框1里面的內(nèi)容保存在文件的末尾,然后將文件里面的所有內(nèi)容讀出來(lái),顯示在編輯框2里面。提示:應(yīng)預(yù)先建立test.txt文件。(4)編譯、連接,運(yùn)行結(jié)果如圖11.1所示。圖11.1 運(yùn)行結(jié)果上面的編

17、輯框2中顯示的是文件中的所有內(nèi)容,在當(dāng)前文件夾下可以找到“test.txt”文件,以記事本形式打開(kāi),可以看到里面內(nèi)容如下:這是第一次輸入這是第二次輸入下面進(jìn)行第三次輸入好了,任務(wù)完成了本節(jié)介紹了使用MFC中封裝的文件類進(jìn)行文件操作的基本方法和步驟。利用CFile類使得對(duì)文件的操作更加簡(jiǎn)單和方便。該類包含了許多常見(jiàn)的操作。正確使用其提供的成員可以使得文件操作十分方便。11.3 CFileFind類CFileFind類是一個(gè)從CObject派生來(lái)的類。它可以對(duì)本地文件和遠(yuǎn)程文件進(jìn)行搜索和查找。是一個(gè)對(duì)文件系統(tǒng)操作常用的類。本節(jié)介紹該類的主要成員及其用法。11.3.1 初識(shí)CFileFind類CFi

18、leFind類是進(jìn)行文件查找的類??梢詫?duì)本地文件和遠(yuǎn)程文件進(jìn)行查找。同時(shí)可以獲取文件的各種信息,例如文件的大小、文件的創(chuàng)建時(shí)間、文件的屬性等。CFileFind類主要的成員函數(shù)及其參數(shù)包括下面一些。(1)FindFile()函數(shù),該函數(shù)實(shí)現(xiàn)文件的查找。其函數(shù)原型如下:virtual BOOL FindFile( LPCTSTR pstrName = NULL, DWORD dwUnused = 0 );該函數(shù)若返回非0則表明執(zhí)行成功,0則表明執(zhí)行不成功。各個(gè)參數(shù)意義如下所示。pstrName:需要查找的文件名,例:“E:VC+Test.rar”,也可以是NULL表示“*.*。dwUnused:

19、必須為0。說(shuō)明:在Visual C+中“”表示的是一個(gè)“”,因?yàn)榈谝粋€(gè)“”表示的是轉(zhuǎn)義字符。如果要出現(xiàn)兩個(gè)反斜杠,那么可以寫出如下形式:“”。(2)FindNextFile()函數(shù),該函數(shù)查找是否還有符合條件的文件。其函數(shù)原型如下:virtual BOOL FindNextFile( );該函數(shù)返回值非0表示還有符合條件的文件,0表示是最后一個(gè)文件。(3)GetCreationTime()函數(shù),查找文件的創(chuàng)建時(shí)間。函數(shù)原型如下:virtual BOOL GetCreationTime(FILETIME *pFileTime) constvirtual BOOL GetCreationTime(

20、CTime& refTime) const;該函數(shù)用來(lái)獲得查找到的某個(gè)文件的創(chuàng)建時(shí)間,返回值非0表示獲得創(chuàng)建時(shí)間操作成功,0表示執(zhí)行獲得創(chuàng)建時(shí)間失敗。參數(shù)意義如下所示。FILETIME*:容納時(shí)間的結(jié)構(gòu)指針。CTime&:容納時(shí)間的對(duì)象地址。(4)GetLastAccessTime()函數(shù),得到文件最后被訪問(wèn)的時(shí)間。函數(shù)原型如下:virtual BOOL GetLastAccessTime(FILETIME *pFileTime) constvirtual BOOL GetLastAccessTime(CTime& refTime) const;該函數(shù)用來(lái)獲得某個(gè)文件最

21、后被訪問(wèn)的時(shí)間,非0表示執(zhí)行成功,0表示執(zhí)行失敗。(5)GetFilePath()函數(shù),該函數(shù)用來(lái)查找文件的絕對(duì)路徑。函數(shù)原型如下:virtual CString GetFilePath() const;該函數(shù)用來(lái)獲得查找到的文件絕對(duì)路徑,必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。返回的結(jié)果是CString對(duì)象。(6)GetFileName()函數(shù),該函數(shù)可以用來(lái)得到文件的全稱。函數(shù)的原型如下:virtual CString GetFileName() const;該函數(shù)用來(lái)獲得查找到的文件的全稱,必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。返回的結(jié)果是C

22、String對(duì)象,例“Test.rar”。(7)GetFileTitle()函數(shù),可以用來(lái)得到文件的名稱。函數(shù)原型如下:virtual CString GetFileTitle() const;該函數(shù)用來(lái)獲得查找到的文件的名稱,必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。返回的結(jié)果是CString對(duì)象,例“Test”。(8)GetRoot()函數(shù),得到查找文件的根目錄,函數(shù)原型如下:virtual CString GetRoot() const;該函數(shù)用來(lái)獲得查找到的文件的根目錄,必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。返回的結(jié)果是CString對(duì)象,例

23、“E:”。(9)GetFileURL()函數(shù),查找文件的URL路徑。函數(shù)原型如下:virtual CString GetFileURL() const;該函數(shù)用來(lái)獲得查找到的文件的URL路徑,必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。返回的結(jié)果是CString對(duì)象,例“file:/E:Test.rar”。(10)GetLength()函數(shù),獲取文件的長(zhǎng)度。函數(shù)原型如下:DWORD GetLength() const;該函數(shù)返回值獲得查找到的文件的長(zhǎng)度,必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。(11)IsHidden() 函數(shù),判斷文件屬性。函數(shù)原型如下

24、:BOOL IsHidden() const;該函數(shù)用來(lái)判斷查找的文件屬性是否隱藏文件,非0表示是,0表示不是。必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。(12)MatchesMask函數(shù),查找文件的綜合屬性。函數(shù)原型如下:BOOL MatchesMask(DWORD dwMask) const;該函數(shù)用來(lái)判斷查找的文件的綜合屬性,非0表示是,0表示不是。必須在執(zhí)行了FindNextFile()后該函數(shù)才能執(zhí)行成功。dwMask參數(shù)表示文件屬性的結(jié)構(gòu),其取值為下面的一種或幾種。FILE_ATTRIBUTE_ARCHIVE:檔案文件。FILE_ATTRIBUTE_COMPRE

25、SSED:壓縮文件。FILE_ATTRIBUTE_DIRECTORY:路徑文件。FILE_ATTRIBUTE_NORMAL:正常文件。FILE_ATTRIBUTE_READONLY:只讀文件。FILE_ATTRIBUTE_SYSTEM:系統(tǒng)文件。FILE_ATTRIBUTE_TEMPORARY:臨時(shí)文件。FILE_ATTRIBUTE_HIDDEN:隱藏文件。注意:在上面函數(shù)中有些函數(shù)必須在執(zhí)行了FindNextFile()后才能調(diào)用。否則程序會(huì)產(chǎn)生異常。11.3.2 使用CFileFind類CFileFind函數(shù)可以對(duì)本地文件進(jìn)行查找。最常用的例如遍歷某個(gè)文件夾下的所有文件等。例如,Windo

26、ws自帶的資源管理器就可以利用該類來(lái)實(shí)現(xiàn)。本節(jié)結(jié)合一個(gè)小例子介紹該類的使用?!臼纠?1.4】 利用CFileFind類遍歷D:目錄下的“test”文件夾下的所有文件。并顯示在樹(shù)視圖控件中。具體步驟如下所述。(1)創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序。在上面添加一個(gè)樹(shù)視圖控件,其ID為IDC_TREE,并且設(shè)置控件的樣式為有節(jié)點(diǎn)前面的“+”號(hào)等,樣式設(shè)置如圖11.2所示。圖11.2 設(shè)置樹(shù)視圖樣式(2)在CTestDlg中添加變量如下:CImageList m_imageList;TV_INSERTSTRUCT tvinsert;HTREEITEM hDad;HICON hIcon;(3)在OnInit

27、Dialog()函數(shù)中對(duì)樹(shù)視圖控件進(jìn)行初始化工作,包括設(shè)置圖標(biāo)等。代碼如下:分析:上面的代碼對(duì)樹(shù)視圖的樣式、圖標(biāo)等內(nèi)容進(jìn)行了初始化工作。并且顯示了第一層圖標(biāo)。但此時(shí)需要遍歷搜索D:test目錄下的所有文件,并將文件名在樹(shù)視圖上顯示出來(lái)。下面對(duì)文件搜索進(jìn)行介紹。(4)在CTestDlg中添加一個(gè)函數(shù)實(shí)現(xiàn)文件的遍歷查找,void Findfile(CString str, HTREEITEM h);函數(shù),在該函數(shù)中遍歷查找文件,并且將文件目錄顯示在樹(shù)視圖控件中。代碼如下:分析:上面函數(shù)利用遞歸實(shí)現(xiàn)文件的遍歷。并且將文件目錄顯示在樹(shù)視圖控件上。需要注意的是當(dāng)所示的文件為一個(gè)目錄時(shí)要對(duì)該目錄進(jìn)行遍歷,

28、此時(shí)進(jìn)行搜索時(shí),要保留當(dāng)前的節(jié)點(diǎn),然后該節(jié)點(diǎn)稱為父節(jié)點(diǎn),進(jìn)行顯示。搜索結(jié)束后再次設(shè)置當(dāng)前節(jié)點(diǎn)為剛才保留的同級(jí)節(jié)點(diǎn)。為了在對(duì)話框顯示時(shí)就搜索文件,可以在上面的OnInitDialog()函數(shù)中調(diào)用上面的函數(shù)。(5)編譯、連接,運(yùn)行結(jié)果如圖11.3所示。圖11.3 運(yùn)行結(jié)果通過(guò)上面的實(shí)例可以看到CFileFind的具體使用方法,使用CFileFind可以方便地對(duì)各種目錄下的文件進(jìn)行搜索。它可以對(duì)本地文件和遠(yuǎn)程文件進(jìn)行搜索和查找。是一個(gè)對(duì)文件系統(tǒng)操作時(shí)常用的類。在進(jìn)行文件系統(tǒng)的程序設(shè)計(jì)中經(jīng)常使用該類進(jìn)行文件的查找操作等。11.4 數(shù)據(jù)的對(duì)象化串行化在文檔程序設(shè)計(jì)中曾經(jīng)介紹了MFC中串行化的概念。所謂

29、的串行化是指微軟提供的用于對(duì)對(duì)象進(jìn)行文件輸入輸出的一種機(jī)制。在CObject類中提供了串行化的操作,因此使用串行化操作可以方便地實(shí)現(xiàn)CFile類的存儲(chǔ)問(wèn)題。11.4.1 CFile類與串行化CFile類是MFC中進(jìn)行文件操作的類,該類直接從CObject類派生而來(lái)。因此該類可以利用串行化進(jìn)行輸入輸出。為了實(shí)現(xiàn)串行化,可以先了解串行化的知識(shí)。所謂的串行化是指將對(duì)象存儲(chǔ)到介質(zhì)中,之后可以通過(guò)反串行化從這些連續(xù)的數(shù)據(jù)重新構(gòu)建一個(gè)與原始對(duì)象狀態(tài)相同的對(duì)象,因此在特定情況下也可以說(shuō)是得到一個(gè)副本。在MFC的主要基類CObject類中提供了對(duì)串行化的支持,在使用串行化時(shí),可以首先創(chuàng)建一個(gè)CArchive對(duì)

30、象,然后使用該對(duì)象進(jìn)行串行化操作。CArchive類在MFC中沒(méi)有任何基類,該類提供了一個(gè)類型安全緩沖機(jī)制,用于將可串行化對(duì)象寫入CFile對(duì)象或從中讀取可串行化對(duì)象。CArchive類的對(duì)象是作為串行化對(duì)象和存儲(chǔ)介質(zhì)之間的中介。因此在使用CArchive對(duì)象前必須先建CFile對(duì)象,然后使用該CFile對(duì)象定義CArchive對(duì)象。下面介紹CFile進(jìn)行串行化保存和讀取的基本過(guò)程,數(shù)據(jù)保存時(shí)的基本步驟為:(1)創(chuàng)建一個(gè)CFile對(duì)象,此時(shí)需要?jiǎng)?chuàng)建文件。(2)創(chuàng)建一個(gè)CArchive對(duì)象,此時(shí)需要使用CFile對(duì)象,參數(shù)為CArchive:store類型。(3)重載Serialize()函數(shù),

31、實(shí)現(xiàn)串行化操作。(4)在需要保存的地方調(diào)用Serialize()函數(shù),實(shí)現(xiàn)保存。上面介紹了CFile進(jìn)行串行化保存的基本步驟,串行化讀?。ㄒ卜Q為反串行化)的步驟與保存時(shí)的基本步驟類似。只不過(guò)創(chuàng)建CArchive對(duì)象時(shí)指定參數(shù)為CArchive:load。CFile可以進(jìn)行數(shù)據(jù)的存儲(chǔ)和讀取,而CArchive從一個(gè)更高的層次上進(jìn)行了數(shù)據(jù)的管理。這樣使得CFile類轉(zhuǎn)換到CArchive類,然后實(shí)現(xiàn)串行化操作。在11.4.2節(jié)中將看到使用串行化操作的具體的使用過(guò)程。說(shuō)明:CArchive類并不是MFC整個(gè)系統(tǒng)中的類,它沒(méi)有基類。但是在MFC中提供了進(jìn)行串行化操作異常類:CArchiveExcept

32、ion類。11.4.2 操作實(shí)例前面介紹了CFile類與串行化的關(guān)系,在實(shí)際應(yīng)用中使用串行化操作可以簡(jiǎn)化數(shù)據(jù)的處理過(guò)程,使得應(yīng)用程序更加簡(jiǎn)單。下面結(jié)合具體實(shí)例介紹CFile進(jìn)行串行化的基本過(guò)程?!臼纠?1.5】 創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序,在上面添加多個(gè)編輯框控件實(shí)現(xiàn)學(xué)生信息的輸入。實(shí)現(xiàn)數(shù)據(jù)的保存和讀取。具體步驟如下所述。(1)創(chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序。(2)在對(duì)話框上添加多個(gè)編輯框控件,實(shí)現(xiàn)對(duì)學(xué)生信息的輸入。并且利用向?qū)槲谋究蚩丶砑幼兞?。控件的ID和添加的變量,以及輸入的信息如表11.4所示。表11.4 編輯框的ID和變量控件控件ID變變 量量功功 能能IDC_NAMECStringm_name;姓名姓名IDC_AGEintm_age;年齡年齡IDC_SEXCStringm_sex;性別性別IDC

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論