版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC 61850:2025 SER EN Communication networks and systems for power utility automation - ALL PARTS
- 黑龍江省牡丹江市第三子共同體2024-2025學(xué)年高二上學(xué)期期末歷史試卷(含答案)
- 英語-山東省濰坊市、臨沂市2024-2025學(xué)年度2025屆高三上學(xué)期期末質(zhì)量檢測試題和答案
- 2024社保工傷保險責(zé)任限額約定合同
- 企業(yè)競爭圖譜:2024年工業(yè)電機 頭豹詞條報告系列
- 2024版汽車服務(wù)加盟合同范本模板
- 2024藥店負(fù)責(zé)人任期藥店藥品市場調(diào)研與市場分析聘用合同3篇
- 福建省南平市峻德中學(xué)高一英語月考試卷含解析
- 2024股東借款合同范本員工福利費借款
- 2024版轉(zhuǎn)讓土地協(xié)議書
- 2025湖北襄陽市12345政府熱線話務(wù)員招聘5人高頻重點提升(共500題)附帶答案詳解
- 血細(xì)胞分析報告規(guī)范化指南2020
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導(dǎo)材料之7:“5領(lǐng)導(dǎo)作用-5.1領(lǐng)導(dǎo)作用和承諾”(雷澤佳編制-2025B0)
- 2024年快速消費品物流配送合同6篇
- 廣東省茂名市2024屆高三上學(xué)期第一次綜合測試(一模)歷史 含解析
- 神經(jīng)重癥氣管切開患者氣道功能康復(fù)與管理學(xué)習(xí)與臨床應(yīng)用
- 第5章 一元一次方程大單元整體設(shè)計 北師大版(2024)數(shù)學(xué)七年級上冊教學(xué)課件
- 人教版高一地理必修一期末試卷
- 遼寧省錦州市(2024年-2025年小學(xué)六年級語文)部編版期末考試(上學(xué)期)試卷及答案
- 2024年下半年鄂州市城市發(fā)展投資控股集團限公司社會招聘【27人】易考易錯模擬試題(共500題)試卷后附參考答案
- GB/T 29498-2024木門窗通用技術(shù)要求
評論
0/150
提交評論