MFC中文件操作、查找與選擇總結(jié)_第1頁
MFC中文件操作、查找與選擇總結(jié)_第2頁
MFC中文件操作、查找與選擇總結(jié)_第3頁
MFC中文件操作、查找與選擇總結(jié)_第4頁
MFC中文件操作、查找與選擇總結(jié)_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、MFC總結(jié)(一):MFC中文件操作、查找與選擇總結(jié)(1) 本文主要涉及以下幾個方面,均為在MFC編程中較為常用的:CFile操作、CArchive操作、如何選擇文件和文件夾、如何查找文件、獲取當(dāng)前目錄、_access函數(shù)等。     (一)使用CFile類操作文件       CFile類在MFC的文件操作中應(yīng)該是最常用的了。主要的成員函數(shù)有Open、Close、Write、Read、Seek、SeekToEnd、GetLength、GetPosition,具體用法見MSDN。

2、0;      (1)文件打開操作:        文件打開有兩種方式,一種是先定義類對象,在用Open函數(shù)打開;一種是在定義類對象時傳入文件名和打開方式。分別如下        CFile file;        if(!file.Open(lpszFileName, nOpenFlags )     &

3、#160;        return;       或       CFile file(lpszFileName, nOpenFlags);      (2)文件打開方式:       文件打開方式,即上述nOpenFlags的值主要由一些宏定義的值組合而成,具體見MSDN,常用的有如下幾種:   

4、60;   A. CFile:modeCreate |  CFile:modeNoTruncate |CFile:modeWrite ,以寫文件的方式打開,如果文件不存在,則新建文件,否則打開已有文件進(jìn)行寫入操作,此時不會清空原有文件;       B. 將上述CFile:modeWrite更換為CFile:modeRead 或者CFile:modeReadWrite 可實現(xiàn)讀操作或者同時讀寫。    (3

5、)判斷文件結(jié)束     判斷文件是否結(jié)束,沒有結(jié)束則繼續(xù)讀取,否則關(guān)閉退出。這點在編程時常用。對于CFile常用的判斷文件結(jié)束的方法是:    while(file.GetPosition() < file.GetLength()       /文件未結(jié)束           /Add code .        (4)值得注意的幾點:  &

6、#160;  A. 當(dāng)文件名中包含路徑時,要注意使用,如C:MyFile.DAT,在Unicode下時,需要使用_T("C:MyFile.DAT");     B. 采用(2)中A方式寫文件時,注意使用file.SeekToEnd()將文件指針移至文件尾,再寫入,否則會覆蓋已有的數(shù)據(jù),這點經(jīng)常被很多初學(xué)者忽視;     C. 在打開文件后就要緊接著寫下Close,養(yǎng)成這樣的習(xí)慣,避免忘記關(guān)閉文件。特別是在對某個讀出的數(shù)據(jù)進(jìn)行判斷,如何符合條件則函數(shù)返回,此時一定要切記返回前關(guān)閉文件;&

7、#160;    D. CFile讀寫文件都是按照字節(jié)來實現(xiàn)的。        未完,待續(xù)。 MFC總結(jié)(一):MFC中文件操作、查找與選擇總結(jié)(2)(二)CArchive類操作     CArchive類實現(xiàn)數(shù)據(jù)的緩沖區(qū)讀寫,同時定義了類對象的存儲與讀取方案。 在文檔視圖編程,結(jié)合CList和CArray等可很方便的實現(xiàn)數(shù)據(jù)讀寫。     (1)基本數(shù)據(jù)讀寫-顯示創(chuàng)建CArchive對象  &#

8、160;  A.  使用CArhive類之前,必須要有一個CFile文件對象,同時必須保證CArchive的操作必須是在CFile處于打開狀態(tài),且操作期間文件狀態(tài)不會發(fā)生變化。     B. 然后定義CArchive對象,將其與CFile對象關(guān)聯(lián),并指定其模式是用于緩沖區(qū)讀還是寫:      CArchive ar (pFile,             /目標(biāo)文件,CFile對象指針   

9、60;                          nMode,        /操作方式, 讀/寫             

10、0;                nBufSize,    /指定緩沖區(qū)大小,默認(rèn)為4096                          &#

11、160;   lpBuf           /緩沖指針,默認(rèn)為NULL,即從本地堆中取出一塊內(nèi)存空間,操作結(jié)束后自動釋放                            );  &#

12、160;   C.對于基本數(shù)據(jù)類型,可直接使用operator >>和operator <<進(jìn)行數(shù)據(jù)讀出和寫入。這些數(shù)據(jù)類型BYTE、WORD、LONG、DWORD、float、double、int、short、char、unsigned u等。 對于CString對象也可使用。       對于自定義的結(jié)構(gòu)體數(shù)據(jù)類型,我們自己可以重載這兩個運算符,一個示例如下。cpp view plaincopy1. typedef struct test_st &

13、#160;2.   3.      float valueX;  4.      float valueY;  5.   6.      /重載<<和>>運算符  7.     friend CArchive& AFXAPI o

14、perator <<(CArchive& ar, const test_st& info)  8.     9.         /保存  10.        ar<<info.valueX<<info.valueY;  11.  &#

15、160;     return ar;  12.     13.    friend CArchive& AFXAPI operator >>(CArchive& ar, test_st& info)  14.      15.    

16、0;    /讀取  16.         ar>>info.valueX>>info.valueY;  17.         return ar;  18.      19. TEST;     &#

17、160; D. 使用Read和Write可實現(xiàn)指定數(shù)據(jù)長度的數(shù)據(jù)寫入/讀取,這里的數(shù)據(jù)長度指的是字節(jié)數(shù)。         使用WriteString可寫入字符串,ReadString可讀出一行字符。注意這里WriteString并不是寫入一行字符串,WriteString寫入的字符串時不會寫入'0',也不會自動寫入'n'。下面是來自MSDN的一個例子,相信能說明問題。cpp view plaincopy1. CFile myFile("myfile&qu

18、ot;, CFile:modeCreate | CFile:modeReadWrite);  2. CString str1="String1", str2="String2", str;  3.   4. / Create a storing archive.  5. CArchive arStore(&myFile, CArchive:store

19、);  6.   7. / Write str1 and str2 to the archive  8. arStore.WriteString( str1 );  9. arStore.WriteString( "n" );  10. arStore.WriteString( str2 );  11. arStore.Writ

20、eString( "n" );  12.   13. / Close the storing archive  14. arStore.Close();  15.   16. / Create a loading archive.  17. myFile.SeekToBegin();  18. CArchive arLoad(&

21、amp;myFile, CArchive:load);  19.   20. / Verify the two strings are in the archive.  21. arLoad.ReadString( str );  22. ASSERT( str = str1 );  23. arLoad.ReadString( str&

22、#160;);  24. ASSERT( str = str2 );        E. IsLoading 和 IsStoring函數(shù)常用來判斷是讀取還是寫入。          Close函數(shù)用于切斷與CFile對象的關(guān)聯(lián),在這之前會自動調(diào)用Flush將緩沖區(qū)數(shù)據(jù)寫入存儲媒質(zhì)中。     F. 在程序中,如果沒有調(diào)用函數(shù)Flush()

23、,那么真正將數(shù)據(jù)寫入到物理磁盤是在調(diào)用函數(shù)Close()關(guān)閉時。因此,一些重要的數(shù)據(jù)需要使用Flush()函數(shù)立即寫入文件,以防丟失。      (2)類對象的讀寫       A. 利用CArchive保存/加載一個類對象,則此類必須支持串行化。      B. 自定義串行化類的五個步驟:          繼承CObject類; &#

24、160;        重載CObject類的Serialize成員函數(shù);          在類的.h文件中,進(jìn)行串行化的聲明:DECLARE_SERIAL(類名);          定義一個無參數(shù)的構(gòu)造函數(shù);          在類的.cpp文件中,進(jìn)行

25、聲明:IMPLEMENT_SERIAL(類名, CObject, 版本號)      C. 在自定義的類的Serialize成員函數(shù)下,使用上述(1)中的方法,保存/加載基本數(shù)據(jù)類型。如下。在需要文件操作的地方,直接調(diào)用該函數(shù)即可。cpp view plaincopy1. void CXXXX:Serialize(CArchive &ar)  2.   3.      if (ar.IsStoring()&#

26、160; 4.          /保存  5.           /Add code.  6.        7.      else  8.      &

27、#160;  /讀取  9.   10.         /Add code.  11.        12.          D. 利用此方法,可實現(xiàn)數(shù)據(jù)的分布式保存。通常在文檔視圖編程時,我們在文檔類下定義數(shù)據(jù)對象,然后在其Serialize函數(shù)下實現(xiàn)數(shù)據(jù)的保存/加載即可。

28、通常我們會定義一個容器,用來存放數(shù)據(jù)。例如,在我的項目中,我使用了CTypedPtrList<CObList, CObject*> m_DataList;這是一個鏈表,里面元素為CObject類對象的指針,當(dāng)我們自定義了支持串行化的類后,就可以把數(shù)據(jù)加入到這個鏈表中,很方便的實現(xiàn)數(shù)據(jù)管理和存儲。MFC總結(jié)(一):MFC中文件操作、查找與選擇總結(jié)(3)(三)為保存文件選擇路徑    A. 使用SHBrowseForFolder函數(shù)創(chuàng)建一個對話框,用于選擇路徑。其原型為           

29、60;        LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi)其中,返回值是一個指針,一個項目標(biāo)識符列表,如果用戶選擇了取消的話,則返回NULL。輸入?yún)?shù)lpbi為BROWSEINFO結(jié)構(gòu)體指針,用于設(shè)置對話框的一些屬性,其結(jié)構(gòu)分析如下。cpp view plaincopy1. typedef struct _browseinfo   2.     HWND hwndOwner; 

30、;        /路徑選擇對話框的父窗口句柄,可設(shè)為this->m_hWnd  3.     LPCITEMIDLIST pidlRoot; /瀏覽時的初始根目錄,設(shè)為NULL時為桌面目錄  4.     LPTSTR pszDisplayName;  /用于保存用戶選中的路徑  5.    

31、; LPCTSTR lpszTitle;      /對話框標(biāo)題  6.     UINT ulFlags;           /指定對話框的一些特性,為一些值的組合  7.     BFFCALLBACK lpfn;    &

32、#160;  /處理事件的回調(diào)函數(shù),一般設(shè)為NULL  8.     LPARAM lParam;          /應(yīng)用程序傳給回調(diào)函數(shù)的參數(shù),一般設(shè)為NULL  9.     int iImage;           &#

33、160; /保存被選取的文件夾的圖片索引,一般設(shè)為NULL  10.  BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;   B. 當(dāng)選擇了一個路徑后,使用函數(shù)SHGetPathFromIDList提取出選擇的路徑。其原型為        BOOL SHGetPathFromIDList(LPCITEMIDLIST pidl,LPTSTR pszPath)其中,輸入

34、參數(shù)pidl為上述SHBrowseForFolder的返回值,輸出參數(shù)pszPath為所選擇路徑。調(diào)用成功則返回TRUE。    C. 應(yīng)用示例。cpp view plaincopy1. /更改文件保存路徑  2. void CTestDlg:OnPathselect()   3.   4.      /調(diào)用兩個函數(shù)SHBrowseForFolder,SHGetPathFromIDList  5. 

35、0;    LPITEMIDLIST pID;   /定義第一個函數(shù)的返回值  6.      BROWSEINFO lpbi;    /定義其輸入值  7.      char pathMAX_PATH;  /保存路徑  8.     &

36、#160;/為lpbi賦值  9.      memset(&lpbi,0,sizeof(BROWSEINFO);  10.      lpbi.hwndOwner=this->m_hWnd;    / 父窗口句柄  11.      lpbi.lpszTitle="請選擇保存路徑"  

37、;/ 顯示位于對話框左上部的標(biāo)題  12.      lpbi.ulFlags=BIF_EDITBOX      / 指定對話框的外觀和功能的標(biāo)志  13.      pID=SHBrowseForFolder(&lpbi);      /選擇路徑,獲取ID  14.   

38、;   if(pID!=NULL)      15.        /如果成功得到  16.         SHGetPathFromIDList(pID,path);  /獲取路徑  17.         GetD

39、lgItem(IDC_PATH)->SetWindowText(path);   /顯示路徑   18.        19.   (四)選擇文件    A. 使用CFileDialog類,定義一個對象。其構(gòu)造函數(shù)如下。cpp view plaincopy1. CFileDialog(  2.    BOOL bOpenFileDialog,

40、          /為TRUE表示“打開”對話框,為FALSE表示“保存”對話框  3.    LPCTSTR lpszDefExt = NULL,     /指定默認(rèn)的文件擴展名  4.    LPCTSTR lpszFileName = NULL,   

41、/指定默認(rèn)的文件名  5.    DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,   /指定一些風(fēng)格  6.    LPCTSTR lpszFilter = NULL,     /指定可供選擇的文件類型和相應(yīng)的擴展名  7.   

42、60;CWnd* pParentWnd = NULL,       /父窗口指針  8.    DWORD dwSize = 0  9. );     B. 文件類型和擴展名的書寫格式(參數(shù)lpszFilter)    文件類型說明和擴展名之間用 | 分割;    同種文件類型的擴展名之間用;分割;

43、    每種文件類型之間用 | 分割;    末尾用 | 指明 例如,“Data Files(*.xlc;*xls)|*.xlc;*.xls|All Files(*.*)|*.*|”。其中,藍(lán)色表示文件類型說明,粉色表示擴展名。   C. 定義CFileDialog類對象后,可使用DoModal函數(shù)來產(chǎn)生對話框,選擇文件。在對話框“確定”返回后,可使用下列函數(shù)獲取路徑和文件名。    主要函數(shù)為:GetPathName,GetFileName,GetExtName, GetF

44、ileTile等。   D. 應(yīng)用該類成員變量m_ofn可設(shè)置初始目錄。如 dlg.m_ofn.lpstrInitialDir=_T("C:")。   E. 應(yīng)用函數(shù)GetStartPosition和GetNextPathName可實現(xiàn)選擇多個文件的情況。   F. 一個示例,用于選擇單個文件。cpp view plaincopy1. /選擇發(fā)送的文件  2. void CTestDlg:OnSelectfile()   3.  

45、60;4.     CString str;  5.     CFileDialog dlg(TRUE,NULL,NULL,NULL,  6.         "DATA Files(*.dat;*.txt)|*.dat;*.txt|All Files(*.*)|*.*|",this);/定義對象  7.  

46、   if(dlg.DoModal()=IDOK)  8.       9.     str=dlg.GetPathName();    /獲取文件名  10.       11.   12.     UpdateData(TRUE);  13. &

47、#160;   m_nFilePath=str;  /顯示路徑  14.     UpdateData(FALSE);  15.   (五)在指定目錄下查找文件    A. 使用CFileFind類可查找指定目錄下的文件,涉及的函數(shù)有查找函數(shù)FindFile和FindNextFile,獲取文件屬性函數(shù)和判斷文件屬性函數(shù),詳見MSDN。    B. 對于查找函數(shù),cpp view

48、 plaincopy1. BOOL FindFile(  2.    LPCTSTR pstrName = NULL,  /查找的文件說明  3.    DWORD dwUnused = 0        /必須為0  4. );  5. virtual BOOL Fi

49、ndNextFile(); /返回非0表示還有符合條件的文件,返回0表示是最后一個符合條件的文件   需要查找的文件名pstrName可設(shè)為以下幾種:                               "E:VC+example.txt"   “E:VC+ex*.txt”   &

50、quot;E:VC+*.*"     C.一個示例。cpp view plaincopy1. CFileFind finder;  2. BOOL bResult = finder.FindFile(_T("C:te*.dat");  3. while(bResult)  4.   5.     bResult = finder.Find

51、NextFile();  6.     cout<<(LPCTSTR)finder.GetFileName()<<endl;  7.    (六)獲取可執(zhí)行程序所在的目錄   A. 對于API函數(shù)GetCurrentDirectory雖然從字面意思上看是獲取當(dāng)前目錄,其實獲取的并不是.exe執(zhí)行文件所在的目錄,而是其上一級目錄。例如,程序安裝在桌面上,我們通過該函數(shù)獲取的路徑是C:Documents and SettingsAdministrator,而不是C:Documents and SettingsAdministrator桌面。   B. 如需獲取程序執(zhí)行時所在的目錄,可使用另外一個API函數(shù):GetModuleFileName。采用該函數(shù)可獲取程序當(dāng)前執(zhí)行的文件名(包含完整的路徑),然后結(jié)合_tsplitpath函數(shù)可分解出路徑、文件名、擴展名,再根據(jù)需要進(jìn)行組合。   C. 下面是本人在程序中常使用的一個函數(shù):cpp view plaincopy1. /獲取當(dāng)前程序運行目錄  2. CString GetCurrentDi

溫馨提示

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

最新文檔

評論

0/150

提交評論