轉(zhuǎn)帖|使用教程|編輯:鮑佳佳|2020-11-23 09:44:52.240|閱讀 529 次
概述:CFile類提供了對文件進行打開,關(guān)閉,讀,寫,刪除,重命名以及獲取文件信息等文件操作的基本功能,足以處理任意類型的文件操作。本文 主要講解讀寫操作。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
CFile類提供了對文件進行打開,關(guān)閉,讀,寫,刪除,重命名以及獲取文件信息等文件操作的基本功能,足以處理任意類型的文件操作。
一個讀寫文件的例子:
文件I/O
雖然使用CArchive類內(nèi)建的序列化功能是保存和加載持久性數(shù)據(jù)的便捷方式,但有時在程序中需要對文件處理過程擁有更多的控制權(quán),對于這種文件輸入輸出(I/O)服務(wù)的需求,Windows提供了一系列相關(guān)的API函數(shù),并由MFC將其封裝為CFile類,提供了對文件進行打開,關(guān)閉,讀,寫,刪除,重命名以及獲取文件信息等文件操作的基本功能,足以處理任意類型的文件操作。CFile類是MFC文件類的基類,支持無緩沖的二進制輸入輸出,也可以通過與CArchive類的配合使用而支持對MFC對象的帶緩沖的序列化。
CFile類包含有一個公有型數(shù)據(jù)成員m_hFile,該數(shù)據(jù)成員包含了同CFile類對象相關(guān)聯(lián)的文件句柄。如果沒有指定句柄,則該值為CFile::hFileNull。由于該數(shù)據(jù)成員所包含的意義取決于派生的類,因此一般并不建議使用m_hFile。
 通過CFile類來打開文件可以采取兩種方式:一種方式是先構(gòu)造一個CFile類對象然后再調(diào)用成員函數(shù)Open()打開文件,另一種方式則直接使用CFile類的構(gòu)造函數(shù)去打開一個文件。下面的語句分別演示了用這兩種方法打開磁盤文件“C:/TestFile.txt”的過程:
C++代碼
// 先構(gòu)造一個實例,然后再打開文件 CFile file; file.Open(“C://TestFile.txt”, CFile::modeReadWrite); …… // 直接通過構(gòu)造函數(shù)打開文件 CFile file(“C://TestFile.txt”, CFile::modeReadWrite);
其中參數(shù)CFile::modeReadWrite是打開文件的模式標(biāo)志,CFile類中與之類似的標(biāo)志還有十幾個,現(xiàn)集中列表如下:
文件模式標(biāo)志 說明
CFile::modeCreate 創(chuàng)建方式打開文件,如文件已存在則將其長度設(shè)置為0
CFile::modeNoInherit 不允許繼承
CFile::modeNoTruncate 創(chuàng)建文件時如文件已存在不對其進行截斷
CFile::modeRead 只讀方式打開文件
CFile::modeReadWrite 讀寫方式打開文件
CFile::modeWrite 寫入方式打開文件
CFile::shareCompat 在使用過程中允許其他進程同時打開文件
 CFile::shareDenyNone 在使用過程中允許其他進程對文件進行讀寫
  CFile::shareDenyRead 在使用過程中不允許其他進程對文件進行讀取
 CFile::shareDenyWrite 在使用過程中不允許其他進程對文件進行寫入
  CFile::shareExclusive 取消對其他進程的所有訪問
CFile::typeBinary 設(shè)置文件為二進制模式
CFile::typeText 設(shè)置文件為文本模式
 這些標(biāo)志可以通過“或”運算符而同時使用多個,并以此來滿足多種需求。例如,需要以讀寫方式打開文件,如果文件不存在就創(chuàng)建一個新的,如果文件已經(jīng)存在則不將其文件長度截斷為0。為滿足此條件,可用CFile::modeCreate、CFile::modeReadWrite和CFile::modeNoTruncate等幾種文件模式標(biāo)志來打開文件:
C++代碼
CFile file ("C://TestFile.txt", CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate);
在打開的文件不再使用時需要將其關(guān)閉,即可以用成員函數(shù)Close()關(guān)閉也可以通過CFile類的析構(gòu)函數(shù)來完成。當(dāng)采取后一種方式時,如果文件還沒有被關(guān)閉,析構(gòu)函數(shù)將負(fù)責(zé)隱式調(diào)用Close()函數(shù)去關(guān)閉文件,這也表明創(chuàng)建在堆上的CFile類對象在超出范圍后將自動被關(guān)閉。由于調(diào)用了對象的析構(gòu)函數(shù),因此在文件被關(guān)閉的同時CFile對象也被銷毀,而采取Close()方式關(guān)閉文件后,CFile對象仍然存在。所以,在顯式調(diào)用Close()函數(shù)關(guān)閉一個文件后可以繼續(xù)用同一個CFile對象去打開其他的文件。
文件讀寫是最常用的文件操作方式,主要由CFile類成員函數(shù)Read()、Write()來實現(xiàn)。其函數(shù)原型分別為:
C++代碼
UINT Read( void* lpBuf, UINT nCount ); void Write( const void* lpBuf, UINT nCount );
參數(shù)lpBuf為指向存放數(shù)據(jù)的緩存的指針,nCount為要讀入或?qū)懭氲淖止?jié)數(shù),Read()返回的為實際讀取的字節(jié)數(shù),該數(shù)值小于或等于nCount,如果小于nCount則說明已經(jīng)讀到文件末尾,可以結(jié)束文件讀取,如繼續(xù)讀取,將返回0。因此通常可以將實際讀取字節(jié)數(shù)是否小于指定讀取的字節(jié)數(shù)或是否為0作為判斷文件讀取是否到達結(jié)尾的依據(jù)。下面這段代碼演示了對文件進行一次性寫入和循環(huán)多次讀取的處理過程:
C++代碼
// 創(chuàng)建、寫入方式打開文件 CFile file; file.Open("C://TestFile.txt", CFile::modeWrite | CFile::modeCreate); // 寫入文件 memset(WriteBuf, 'a', sizeof(WriteBuf)); file.Write(WriteBuf, sizeof(WriteBuf)); // 關(guān)閉文件 file.Close(); // 只讀方式打開文件 file.Open("C://TestFile.txt", CFile::modeRead); while (true) { // 讀取文件數(shù)據(jù) int ret = file.Read(ReadBuf, 100); …… // 如果到達文件結(jié)尾則中止循環(huán) if (ret < 100) break; } // 關(guān)閉文件 file.Close(); Write()和Read()函數(shù)執(zhí)行完后將自動移動文件指針,因此不必再顯示調(diào)用Seek()函數(shù)去定位文件指針。包含有文件定位函數(shù)的完整代碼如下所示: C++代碼 // 創(chuàng)建、寫入方式打開文件 CFile file; file.Open("C://TestFile.txt", CFile::modeWrite | CFile::modeCreate); // 寫入文件 memset(WriteBuf, 'a', sizeof(WriteBuf)); file.SeekToBegin(); file.Write(WriteBuf, sizeof(WriteBuf)); // 關(guān)閉文件 file.Close(); // 只讀方式打開文件 file.Open("C://TestFile.txt", CFile::modeRead); while (true) { // 文件指針 static int position = 0; // 移動文件指針 file.Seek(position, CFile::begin); // 讀取文件數(shù)據(jù) int ret = file.Read(ReadBuf, 100); position += ret; …… // 如果到達文件結(jié)尾則中止循環(huán) if (ret < 100) break; } // 關(guān)閉文件 file.Close();
補充:
使用CFile類對文件進行按結(jié)構(gòu)讀取,如:
C++代碼
CFile fileRead,fileWrite; fileRead.Open(_T("E://a.dat"),CFile::modeRead);//這里使用宏_T fileWrite.Open(_T("E://backup.txt"),CFile::modeCreate | CFile::modeWrite); VIDEOHEADER *videoheader=new VIDEOHEADER(); fileRead.Read(videoheader,sizeof(VIDEOHEADER)); char buf[sizeof(VIDEOHEADER)*8]; sprintf(buf,"videoheader.cCommandID:%s ,videoheader->cCommandID); //通過sprintf對我們需要寫入文件中的數(shù)據(jù)進行格式化,這樣在文件中存儲的數(shù)據(jù)就是以這里定義的格式顯示的。 fileWrite.Write(buf,strlen(buf));
MFC擴展類庫
在平時練習(xí)的時候我們可以自己手動進行,但是一旦接受一些項目,應(yīng)用程序開發(fā)等,對界面的要求就會高出許多。這時候就有必要借助這些“半成品”實現(xiàn)界面美化提升效率。這里簡單介紹一下,具體可點進去查看每個的詳情以及教程,案例!
Toolkit Pro:
Codejock軟件公司的Xtreme Toolkit Pro是屢獲殊榮的VC界面庫,是MFC開發(fā)中最全面界面控件套包,它提供了Windows開發(fā)所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。(點這下載)
BCGControlBar
BCGControlBar ("Business Components Gallery ControlBar")是MFC擴展庫,使您可以創(chuàng)建具有完全自定義選項(功能區(qū)、可自定義工具欄、菜單等)以及一組專業(yè)設(shè)計的豐富Microsoft Office和Microsoft Visual Studio的應(yīng)用程序 GUI控件,例如圖表、日歷、網(wǎng)格、編輯器、甘特圖和許多其他控件。
BCGControlBar庫擁有500多個經(jīng)過全面設(shè)計、測試和充分記錄的MFC擴展類。可以輕松地集成到你的應(yīng)用程序中,并為你節(jié)省數(shù)百個開發(fā)和調(diào)試時間。(點這下載)
QtitanRibbon:
QtitanRibbon是一款遵循Microsoft Ribbon UI Paradigm for Qt技術(shù)的Ribbon UI組件,QtitanRibbon致力于為Windows、Linux和Mac OS X提供功能完整的Ribbon組件。
本文轉(zhuǎn)載自:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn